Runnable接口
- 定义MyRunnable类实现Runnable
- 实现run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
推荐使用Runnable对象,因为Java单继承的局限性
// 创建线程方式2:实现runnable接口,重写run方法,执行需要丢入runnable接口实现类,调用start方法。
public class RunnableDemo implements Runnable{
public static void main(String[] args) {
// 创建runnable接口的实现类对象
RunnableDemo r = new RunnableDemo();
// 创建线程对象,通过线程对象来开启我们的线程
new Thread(r).start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程-----"+i);
}
}
@Override
public void run() {
// run方法线程体
for (int i = 0; i < 200; i++) {
System.out.println("我在打代码-----"+i);
}
}
}
小结
-
继承Thread类
-
子类继承Thread类具备多线程能力
-
启动线程:子类对象.start()
-
不建议使用:避免OOP单继承局限性
-
-
实现Runnable接口:
- 实现接口Runnable具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
// 一份资源
StartThread station = new StartThread();
// 多个代理
new Thread(station,”小明”).start();
new Thread(station,”小张”).start();
new Thread(station,”小红”).start();
实现Callable接口
- 实现Callable接口,需要返回值类型
- 重新call方法,需要抛出异常
- 创建目标对象
- 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
- 提交执行:Future result1 = ser.submit(t1);
- 获取结果:boolean r1 = result1.get()
- 关闭服务:ser.shutdownNow();
-
演示:
public class TestCollable implements Callable<Boolean> { private String url;// 网络图片地址 private String name;// 保存的文件名 public TestCollable(String url,String name){ this.url = url; this.name = name; } @Override public Boolean call() { WebDownloader2 wd = new WebDownloader2(); wd.downloader(url,name); System.out.println("下载了文件名为:"+name); return true; } public static void main(String[] args) throws ExecutionException, InterruptedException { TestCollable t1 = new TestCollable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1239696591,2099251333&fm=26&gp=0.jpg","1.jpg"); TestCollable t2 = new TestCollable("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1271607131,1035620186&fm=26&gp=0.jpg","2.jpg"); TestCollable t3 = new TestCollable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=112978412,2183174438&fm=26&gp=0.jpg","3.jpg"); //创建执行服务 ExecutorService ser = Executors.newFixedThreadPool(1); //提交执行 Future<Boolean> result1 = ser.submit(t1); Future<Boolean> result2 = ser.submit(t2); Future<Boolean> result3 = ser.submit(t3); //获取结果 boolean r1 = result1.get(); boolean r2 = result2.get(); boolean r3 = result3.get(); System.out.println(r1); System.out.println(r2); System.out.println(r3); //关闭服务 ser.shutdownNow(); } } // 下载器 class WebDownloader2{ // 下载方法 public void downloader(String url,String file){ try { FileUtils.copyURLToFile(new URL(url),new File(file)); } catch (IOException e) { e.printStackTrace(); System.out.println("IO异常,downloader方法出现问题"); } } }

本文介绍了Java中实现多线程的三种方式:继承Thread类、实现Runnable接口和实现Callable接口。重点讲解了Runnable接口的使用,它避免了单继承的局限性,使得线程共享资源更为灵活。同时展示了Callable接口的实现,该接口允许返回结果并能抛出异常。通过ExecutorService创建线程池,提交任务并获取结果。
288

被折叠的 条评论
为什么被折叠?



