Java高级_Day16(Runnable实现多线程,线程的同步,线程的死锁)

Java高级_Day16(Runnable实现多线程,线程的同步,线程的死锁)

Runnable实现多线程

Thread(Runnable target) 分配一个新的 Thread对象。
Thread(Runnable target, String name) 分配一个新的 Thread对象。
Runnable接口应由任何类实现,其实例将由线程执行。 该类必须定义一个无参数的方法,称为run

public class RunnableThread implements Runnable{
   

    @Override
    public void run() {
   
        for(int i = 0;i < 100;i++){
   
            System.out.println(Thread.currentThread().getName() + "----" +i);
        }
    }
}
public class RunnableThreadTest {
   
    public static void main(String[] args) {
   
        //创建线程
        Runnable r = new RunnableThread();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r,"线程2");
        //开始执行
        t1.start();
        t2.start();
        //使用内部类创建线程
        Thread t3 = new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                for(int i = 0;i < 100;i++){
   
                    System.out.println(Thread.currentThread().getName() + "----" +i);
                }
            }
        },"线程3");
        t3.start();
        //使用匿名内部类创建线程
        new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                for(int i = 0;i < 100;i++){
   
                    System.out.println(Thread.currentThread().getName() + "----" +i);
                }
            }
        },"线程4").start();

    }
}

继承Thread类和实现Runnable接口
Java 是单继承 多实现

线程的同步

需求:模拟火车站售票厅售卖一趟列车车票的场景:售票厅有三个窗口 在同时售卖一列火车的车票,假设该列车共有100张票

public class Ticket implements Runnable{
   
    //表示车票余量
    private int tick = 100;
    @Override
    public void run() {
   
        while(true){
   
            //如果车票还有剩余,售票
            if(tick > 0){
   
                //售出每张票耗时10ms
                try {
   
                    Thread.sleep(10);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
                //输出售票信息
                System.out.println(Thread.currentThread().getName() + "售出:" + tick-- + "号车票");
            }
            //车票售完
            else{
   
                System.out.println("车票已卖完");
                break;
            }
        }
    }
}
public class TickTest {
   
    public static void main(String[] args) {
   
        //创建三个售票窗口
        Ticket ticket = new Ticket();
        Thread t1 = new Thread(ticket,"1号窗口");
        Thread t2 = new Thread(ticket,"2号窗口");
        Thread t3 = new Thread(ticket,"3号窗口");
        //三个窗口同时售票
        t1.start();
        t2.start();
        t3.start();
    }
}

在这里插入图片描述
在这里插入图片描述
这种问题就是线程安全问题
问题出现的原因:

  • 多个线程同时操作共享数据,但是其中一个线程对共享数据的操作还没有完成,此时另一个线程就加入进来执行对共享数据的操作 ,导致了共享数据的错误

解决的方法:

  • 对于多个线程操作共享数据时 在任何时刻,我们都保证只有一个线程在对共享数据进行操作,如果当前线程的操作没有完成,则不允许其他的线程进入参与执行。

线程同步的解决方案:同步机制:

同步代码块:
格式:

synchronized (同步锁){
   
   需要同步的代码 
}
public class Print {
   
    Object obj = new Object();
    //同步锁
    public void print1(){
   
        synchronized (obj){
   
            System.out.print("中");
            System.out.print("北");
            System.out.print("大");
            System.out.print("学");
            System.out.println();
        }
    }
    public void print2(){
   
        synchronized (obj){
   
            System.out.print("蓝");
            System.out.print("桥");
            System.out.print("学");
            System.out.print("院");
            System.out.println();
        }
    }
}
public static void main(String[] args) {
   
        Print p = new Print();
        new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                while(true){
   
                    p.print1()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值