Java多线程机制知识点复习

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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值