java 吵醒休眠的线程

一、需求

编写一个Java源程序,其中包含:

  1. 编写一个实现了Runnable接口的类,这个类中包含3个线程,3个线程的名字是“张工”,“王工”和“老板”。线程“张工”和线程“王工”分别负责“搬运苹果”(3箱)和“搬运香蕉”(3箱),他们每搬运一箱,就准备休息10秒钟(sleep方法),但是线程“老板”负责不让他们休息(interrupt方法)。

  2. 编写一个包含主方法main的公共类(访问权限为public的类),在主方法main中,使用第1步中编写的类创建一个对象,使用这个对象调用线程“张工”,“王工”和“老板”,并启动线程(start)。


二、知识点

用Runable创建线程:

1、定义一个实现Runable接口的类

2、在此类中重写Runable接口中的run方法(即:将线程运行的代码放入run方法中)

3、通过Thread类建立线程对象

4、将Runable接口的子类对象作为实际参数,传递给Thread类构造方法

5、调用Thread类的start方法开启线程

针对该需求的注意事项:

  • 构造方法中,new Thread的时时候一定要加入this参数

原因:自定run方法所属的对象是Runable接口的子类对象,所以要让线程去执行指定对象的run方法,即要将Runable接口的子类对象传递给Thread的构造函数。


三、使用类

1、Thread类
  • Thread(Runnable target, String name)
    传入一个实现了Runable接口的类以及一个字符串,分配新的 Thread 对象。该Thread对象的run方法为传入的Runable接口的类的run方法,线程的名字为传入的字符串。

  • currentThread()
    <静态方法> 返回CPU正在执行的线程的对象

  • getName()
    返回该线程的名称。

  • sleep(long millis)
    <静态方法> 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

  • start()
    使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

  • interrupt()
    中断线程。

2、Runable接口
  • run()
    使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。

四、代码

class 搞事情 implements Runnable //实现一个Runnable接口的类
{
    Thread 张工,王工,老板;//这个类中包含3个线程
    public 搞事情()
    {
        张工 = new Thread(this,"张工");
        王工 = new Thread(this,"王工");
        老板 = new Thread(this,"老板");
    }   
    public void run()
    {
            if("张工".equals(Thread.currentThread().getName()))  //防止空指针,故用“张工”这个字符串的equals方法
            {
                for(int i=1;i<=3;i++)  //搬完3箱就ok
                {
                    System.out.println(Thread.currentThread().getName()+"已搬运了"+i+"箱苹果");
                    try
                    {
                        Thread.sleep(10000);//每搬运一箱,就准备休息10秒钟(sleep方法)
                    } catch (InterruptedException e)
                    {
                         if(i!=3)
                         {
                             System.out.println("老板让张工继续工作");
                         }
                    }
                }
                return;
            }
            if("王工".equals(Thread.currentThread().getName()))  
            {
                for(int i=1;i<=3;i++)  //搬完3箱就ok
                {
                    System.out.println(Thread.currentThread().getName()+"已搬运了"+i+"箱香蕉");
                    try
                    {
                        Thread.sleep(10000);//每搬运一箱,就准备休息10秒钟(sleep方法)
                    } catch (InterruptedException e)
                    {
                         if(i!=3)
                         {
                             System.out.println("老板让王工继续工作");
                         }
                    }

                }
                return;
            }
            if("老板".equals(Thread.currentThread().getName()))  
            {
                while(true)
                {
                    if(张工.isAlive()||王工.isAlive())
                    {
                        张工.interrupt();
                        王工.interrupt();
                    }
                    else break;
                }
                System.out.println("老板说:可以下班了");
            }
    }

}

public class Main
{
    public static void main(String[] args)
    {
        搞事情 干活儿 = new 搞事情();   //使用第1步中编写的类创建一个对象
        //使用这个对象调用线程“张工”,“王工”和“老板”,并启动线程start
         干活儿.张工.start();
         干活儿.王工.start();
         干活儿.老板.start();
    }
}

五、截图

这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值