Java基础并发(一)之Runnable、Thread的使用

有关于线程与进程的区别请看操作系统之进程管理

文章是《Java编程思想》–Bruce Eckel著,陈昊鹏译的《Thinking in Java》的学习笔记

线程可以驱动任务,如果要在线程上跑任务,那么就需要一种描述任务的方式。这个方式可以有Runnable接口来提供,要想定义一个任务,只需要实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。

package ink.poesy.threadtest;

public class LiftOff implements Runnable{
    protected int countDown = 10;
    private static int taskCount = 0;
    //id用来区分多个线程,final一旦初始化之后就不希望被修改
    private final int id = taskCount++;
    public LiftOff(){}
    public LiftOff(int countDown){
        this.countDown  = countDown;
    }
    public String status(){
        return "#" + id + "("+
                (countDown > 0 ? countDown : "Liftoff!") + "),";
    }

    @Override
    public void run() {
        while (countDown-- > 0){
            System.out.println(status());
            Thread.yield();
        }
    }
}

Thread.yield();线程调度器(java线程机制的一部分,可以将CPU从一个线程转移给另一个线程。意义:我已经执行完生命周期中最重要的不分了,此刻正式切换给其他任务执行一段时间的大好时机)。


注:当从Runnable导出一个类时,它必须具有run()方法,但这个方法并无特殊之处——它不会产生任何内在的线程能力。要实现线程行为,必须显示的将一个任务附着到线程上。看下面的2个例子来说明这个问题。

public class MainThread {
    public static void main(String[] args) {
        LiftOff launch = new LiftOff();
        launch.run();
        System.out.println("wwl");
    }
}

执行10次稳定的显示
执行结果1
上面例子wwl始终显示在最下面。下面这个例子不是

public class BasicThreads {
    public static void main(String[] args) {
        Thread t = new Thread(new LiftOff());
        t.start();
        System.out.println("wwl");
    }
}

执行结果
在这里插入图片描述
上面例子展示了使用Thread来驱动LiftOff对象。
Thread构造器只需要一个Runnable对象。调用Thread对象的start()方法为该线程执行必须的初始化操作,然后调用Runable的run()方法,以便在这个新线程中启动该任务。尽管start()看起来是产生了一个对长期运行的方法调用,但是从输出中可以看到,start()迅速返回了,因为wwl消息再倒计时完成之前就出现了。实际上,你产生的是对LiffOff.run()的方法调用,并且这个方法还没有完成,但是因为LiffOff.run()是由不同的线程执行的,因此你仍旧可以执行main()线程中的其他操作。
将Runnable对象转变为工作任务的传统方式是把它提交给一个Thread构造器


下面是添加更多的线程驱动更多的任务。


第一次执行结果

Waiting for LiftOff!
#0(9),#4(9),#3(9),#2(9),#2(8),
#2(7),#2(6),#2(5),#2(4),#2(3),
#2(2),#2(1),#2(Liftoff!),#3(8),
#3(7),#3(6),#3(5),#3(4),#3(3),
#3(2),#3(1),#3(Liftoff!),#1(9),
#1(8),#1(7),#1(6),#1(5),#1(4),
#1(3),#1(2),#1(1),#1(Liftoff!),
#0(8),#0(7),#0(6),#0(5),#0(4),
#0(3),#0(2),#0(1),#0(Liftoff!),#4(8),
#4(7),#4(6),#4(5),#4(4),#4(3),#4(2),
#4(1),#4(Liftoff!),

第二次执行结果

Waiting for LiftOff!
#0(9),#4(9),#0(8),#4(8),#0(7),#4(7),
#0(6),#4(6),#0(5),#4(5),#0(4),#4(4),
#0(3),#4(3),#0(2),#4(2),#0(1),#4(1),
#0(Liftoff!),#4(Liftoff!),#1(9),#1(8),
#1(7),#1(6),#1(5),#1(4),#1(3),#1(2),
#1(1),#1(Liftoff!),#3(9),#3(8),#3(7),
#3(6),#3(5),#3(4),#3(3),#3(2),#3(1),
#3(Liftoff!),#2(9),#2(8),#2(7),#2(6),
#2(5),#2(4),#2(3),#2(2),#2(1),#2(Liftoff!),

输出说明不同任务的执行在线程被换进换出时混在了一起。


以上内容如有争议、指正,留言给我~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

园长的牧歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值