多线程售票
package cc;
public class www {
public static void main(String[] args) {
//测试 出现超时
// SellTicket sellTicket = new SellTicket();
// SellTicket sellTicket1 = new SellTicket();
// SellTicket sellTicket2 = new SellTicket();
// sellTicket.start();
// sellTicket1.start();
// sellTicket2.start();
System.out.println("使用实现接口方式来售票");
SellTicket02 sellTicket02 = new SellTicket02();
new Thread(sellTicket02).start();
}
}
//使用Thread方式
class SellTicket extends Thread {
private static int tiketNum = 100;//让多个线程共享ticketNum
@Override
public void run() {
while (true) {
if (tiketNum <= 0) {
System.out.println("售票结束");
break;
}
try {//休眠50毫秒,模拟
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + (--tiketNum));
}
}
}
//实现接口方式
class SellTicket02 implements Runnable {
private static int tiketNum = 100;
@Override
public void run() {
while (true) {
if (tiketNum <= 0) {
System.out.println("售票结束");
break;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + (--tiketNum));
}
}
}
通知方式
线程常用方法
public static void main(String[] args) throws InterruptedException {
T t = new T();
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
System.out.println("hi" + i);
}
System.out.println(t.getName() + "线程的优先级" + t.getPriority());
t.interrupt();//执行到这就会中断t线程的休眠
}
class T extends Thread {
@Override
public void run() {
while (true) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "jk" + i);
}
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(20000);//20秒
} catch (InterruptedException e) {
//当线程执行到一个Interrupt方法时,就会catch一个异常 可以加入自己的业务代码
System.out.println(Thread.currentThread().getName());
}
}
}
}
练习题
package cc;
public class www {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new T());//创建子线程
//主线程
for (int i = 1; i <= 10; i++) {
System.out.println("hi" + i);
if (i == 5) {//主线程输出了五次i
t.start();//启动子线程输出hello
t.join();//立即将子线程 插入到主线程main中 让t先执行
}
Thread.sleep(1000);//输出一次hi 休眠一次
}
}
}
//子线程
class T implements Runnable {
private int count = 0;
@Override
public void run() {
while (true) {
System.out.println("hello" + (++count));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count == 10) {
break;
}
}
}
}
用户线程和守护线程
public class www {
public static void main(String[] args) throws InterruptedException {
T t = new T();
//如果希望main线程结束后 子线程自动结束
//只需将子线程设为守护线程就行
t.setDaemon(true);//先设置好再启动
t.start();
for (int i = 0; i < 10; i++) {
System.out.println("uyg");
Thread.sleep(1000);
}
}
}
//子线程
class T extends Thread {
@Override
public void run() {
for (; ; ) {//无限循环
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("uyjtgu");
}
}
}
线程状态转换
Synchronized 线程同步机制
解决上面售票超卖问题:
package cc;
public class www {
public static void main(String[] args) {
SellTicket03 sellTicket03 = new SellTicket03();
new Thread(sellTicket03).start();
new Thread(sellTicket03).start();
new Thread(sellTicket03).start();
}
}
//实现接口方式 使用synchronized实现线程同步
class SellTicket03 implements Runnable {
private boolean loop = true;//控制run变量
private static int tiketNum = 100;
public synchronized void sell() {//同步方法 在同一时刻 只能有一个线程来执行sell()
if (tiketNum <= 0) {
System.out.println("售票结束");
loop = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + (--tiketNum));
}
@Override
public void run() {
while (loop) {
sell(); //sell()是一个同步方法
}
}
}