java 随机数 多线程_java基础之多线程2

第二节 线程的定义和创建

2.1 线程定义和创建2:实现Runnable接口

【示例2】使用多线程实现龟兔赛跑2

public class TortoiseRunnable implements Runnable {

//private int num = 100; /*** 线程体,线程要执行的任务*/

@Override

public void run() {

while(true){

while(true){

System.out.println("乌龟领先了,加油...."+

Thread.currentThread().getName()+" "+

Thread.currentThread().getPriority());

}

}

}

}

public class Test {

public static void main(String[] args) {

//创建乌龟线程对象 //Runnable runnable = new TortoiseRunnable(); Runnable runnable = new Runnable(){

@Override

public void run() {

while(true){

System.out.println("乌龟领先了............"

+Thread.currentThread().getName());

}

}

};

Thread thread1 = new Thread(runnable);

//启动乌龟线程 thread1.start();

Thread thread2 = new Thread(runnable);

thread2.start();

while(true){

System.out.println("兔子领先了,add oil ...."+

Thread.currentThread().getName()+" "+

Thread.currentThread().getPriority());

}

}

}

• 两种方式的优缺点

方式1:继承Thread类

缺点:Java单继承,无法继承其他类

优点:代码稍微简单

方式2:实现Runnable接口

优点 还可以去继承其他类 便于多个线程共享同一个资源

缺点:代码略有繁琐

实际开发中,方式2使用更多一些

• 可以使用匿名内部类来创建线程对象

• 已经学习的线程Thread的属性和方法

2.2 线程定义和创建3:实现Callable接口

JDK1.5后推出了第三种定义线程的方式,实现Callable接口

【示例3】使用多线程获取随机数

public class RandomCallable implements Callable {

@Override

public Integer call() throws Exception {

Thread.sleep(5000);

//throw new IOException(); return new Random().nextInt(10);

}

public static void main(String[] args)

throws InterruptedException, ExecutionException {

//创建线程对象 Callable callable = new RandomCallable();

FutureTask task = new FutureTask(callable);

Thread thread = new Thread(task);

//启动线程 thread.start();

//获取返回值 System.out.println(task.isDone());

//必须等线程执行完毕后,才能得到返回值,线程在此会阻塞 Integer num = task.get();

System.out.println(num);

System.out.println(task.isDone());//线程是否执行完毕 }

}

第三种方式:实现Callable接口

与实行Runnable相比, Callable功能更强大些

• 方法名不同

• 可以有返回值,支持泛型的返回值

• 可以抛出检查异常

• 需要借助FutureTask,比如获取返回结果

Future接口

• 可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。

• FutrueTask是Futrue接口的唯一的实现类

• FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值

2.3 线程的生命周期

• 新生状态:

• 用new关键字建立一个线程对象后,该线程对象就处于新生状态。

• 处于新生状态的线程有自己的内存空间,通过调用start进入就绪状态

• 就绪状态:

• 处于就绪状态线程具备了运行条件,但还没分配到CPU,处于线程就绪队列,等待系统为其分配CPU

• 当系统选定一个等待执行的线程后,它就会从就绪状态进入执行状态,该动作称之为“cpu调度”。

• 运行状态:

• 在运行状态的线程执行自己的run方法中代码,直到等待某资源而阻塞或完成任务而死亡。

• 如果在给定时间片内没执行结束,就会被系统给换下来回到等待执行状态。

• 阻塞状态:

• 处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。

• 在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。

• 死亡状态:

• 死亡状态是线程生命周期中最后一个阶段。线程死亡原因有三个。一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop方法来终止一个线程[不推荐使用】,三是线程抛出未捕获的异常

本节作业

1. 通过实现Runnable接口来定义线程实现龟兔赛跑

2. 通过实现Callable接口来定义线程实现获取随机数

3. 线程的生命周期(就绪状态的三个来源,运行状态的三个去处)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值