1,Thread类与线程的创建
1)使用Thread的子类
2)使用Thread类
public class A{
public static void main(String args[]){
Thread speakCar; // 使用Thread声明线程
CarTarget car; // car是目标对象
car = new CarTarget(); // 创建目标对象
speakCar = new Thread(car); // 创建线程,其目标对象是car
speakCar.start(); // 启动线程,一旦轮到该线程想用CPU,目标对象会自动调用接口中的run方法
for(int i=1;i<=15;i++){ // 主线程输出
System.out.println("主人"+i);
}
}
}
public class B implements Runnable{ // 实现Runnable接口
public void run(){
for(int i=1;i<=15;i++){
System.out.println("汽车"+i);
}
}
}
2,线程的常用方法
① start() 只有处于新建状态的线程才可以调用start()方法。
② run()
③sleep()
④ isAlive() 返回线程状态。
⑤currentThread() 返回当前正在使用CPU的线程
⑥ interrupt() 吵醒休眠的线程,导致线程发生InterruptedException 异常,从而结束休眠。
3,线程同步
当一个线程A使用synchronized修饰方法时,其他线程想使用这个synchronized方法时就必须等待,知道线程A使用完该方法。
wait() 方法可以中断线程的执行,使本线程等待。
如果一个线程在使用这个同步方法时不需要等待,那么就用notifyAll() 方法通知所有由于使用这个同步方法而处于等待的线程结束等待。
例: 张飞和李逵买电影票,售票员只有两张5元的钱,电影票一张5元,张飞拿20元在李逵前面买票,李逵拿一张5元的人民币买票,因此张飞必须等待。
public class A{
public static void main(String args[]){
TicketHouse officer = new TicketHouse();
Thread zhangfei,likui;
zhangfei = new Thread(officer);
zhangfei.setName("张飞");
likui = new Thread(officer);
likui.setName("李逵");
zhangfei .start();
likui.start();
}
}
public class TicketHouse implements Runnable(){
int fiveAmount = 2,tenAmount = 0,twentyAmount = 0;
public run(){
if(Thread.currentThread().getName().equals("张飞")){
saleTicket(20);
}
if(Thread.currentThread().getName().equals("李逵")){
saleTicket(5);
}
}
public synchronized void saleTicket(int money){
if(money == 5){ // 不用等待
fiveAmount = fiveAmount + 1;
System.out.println("给"+Thread.currentThread().getName()+"入场 券"+Thread.currentThread().getName()+"的钱正好");
}
else if(money == 20){
while(fiveAmount<3){
try{
System.out.println("\n"+Thread.currentThread().getName()+"靠边等");
wait(); // money是20 要等待
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
}
catch(InterruptedException e){}
}
fiveAmount = fiveAmount -3;
twentyAmount = twentyAmount + 1;
System.out.println("给"+Thread.currentThread().getName()+"入场 券"+Thread.currentThread().getName()+"给20,找回15元");
}
notifyAll();
}
}