Java的Run/Callable实现
-
学习提示:查看JDK帮助文档
-
定义 MyRunnable 类实现 Runnable 接口
-
实现 run() 方法,编写线程执行体。
-
创建线程对象,调用 start() 方法启动线程。
public class StartThread implements Runnable{
-
推荐使用Runnable对象,因为Java单继承的局限性。
package com.kuang.demo;
//创建线程方法二:实现runnable接口,重写run方法,执行线程需要丢入runnable接口的实现类,调用start方法。
public class TestThread implements Runnable{
小结
-
继承Thread类
-
子类继承Thread类就具备了多线程能力
-
启动线程:子类对象.start()
-
不建议使用,避免面向对象的单继承局限性
-
-
实现Runnable接口
-
实现接口Runnable具有多线程能力
-
启动线程:实例化目标对象 + Thread对象(目标对象).start()
-
推荐使用:避免单继承局限性,极为灵活,方便同一个对象被多个线程使用。
-
//一份资源
StartThread station = new StartThread();
//多个代理,给线程起别名。
new Thread(station, "小明").start();
new Thread(station, "小红").start();
new Thread(station, "小兰").start();
多个线程同时操作同一个对象
package com.kuang.demo;
//多个线程同时操作同一个对象
//买火车票的例子
//发现问题:多个线程操作同一个资源的情况下,线程不安全了,数据紊乱。
public class TestThread implements Runnable{
//火车票数量
private int ticktNums = 10;
-
案例:龟兔赛跑
-
首先来个赛道距离,然后要离终点越来越近。
-
判断比赛是否结束
-
打印出胜利者
-
龟兔赛跑开始
-
故事里是乌龟赢,兔子要睡觉,我们需要模拟兔子睡觉
-
最终乌龟赢得比赛
-
package com.kuang.demo;
//模拟龟兔赛跑
public class Race implements Runnable{
//胜利者
private static String winner;
实现callable接口(了解)
-
实现callable接口,需要返回值类型。
-
重写call方法,需要抛出异常。
-
创建目标对象
-
创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
-
提交执行:Future<Boolean>result1 = ser.submit(t1);
-
获取结果:boolean r1 = result1.get()
-
关闭服务:ser.shuntdownNow();
package com.kuang.demo;
//线程创建方式三:实现callable接口
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//线程实现方式三:实现callable接口。
/** callable的好处
* 1、可以定义返回值
* 2、可以抛出异常
*/
public class TestCallable implements Callable<Boolean>{
private String url; //网络图片地址
private String name; //保存的文件名
public TestCallable(String url, String name){
this.url = url;
this.name = name;
}
//下载图片的线程执行体
浙公网安备 33010602011771号