Java中创建线程的三种方式

1|0Java中创建线程的三种方式

1.继承Thread类创建线程

2.实现Runnable接口创建线程

3.使用Callable和Future创建线程

1|11.Thread创建线程

public class Match1 { public static void main(String[] args) { Runner liuxiang = new Runner(); liuxiang.setName("刘翔"); Runner zhangsan = new Runner(); //线程命名 zhangsan.setName("张三"); liuxiang.start(); zhangsan.start(); } } class Runner extends Thread{ @Override public void run() { Integer speed = new Random().nextInt(100); for (int i = 1; i <= 100; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.getName()+"跑了"+i*speed+"米"); } } }

 

结果:

 

 

1|2 2.实现Runnable接口

public class Match2 { public static void main(String[] args) { Runner2 liuxiang = new Runner2(); // Thread thread1 = new Thread(liuxiang,"刘翔"); Thread thread1 = new Thread(liuxiang); thread1.setName("刘翔"); //后台继承Thread直接用不同,需要创建Thread对象来实现 Thread thread2 = new Thread(new Runner2(),"张三"); thread1.start(); thread2.start(); } } class Runner2 implements Runnable { @Override public void run() { Integer speed = new Random().nextInt(100); for (int i = 1; i <= 100; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //Thread.currentThread()用于获取当前线程 //在Runnable中无法使用this获取当前线程 System.out.println(Thread.currentThread().getName()+"跑了"+i*speed+"米"); } } }

 结果:

 

1|3 3.利用线程池

public class Match3 { public static void main(String[] args) throws ExecutionException, InterruptedException { //创建线程池。线程池中有3个线程,可以执行3个线程,多余的线程会等待。 ExecutorService executorService = Executors.newFixedThreadPool(3); Runner3 liuxiang = new Runner3(); liuxiang.setName("刘翔"); Runner3 zhangsan = new Runner3(); zhangsan.setName("张三"); Runner3 lisi = new Runner3(); lisi.setName("李四"); Runner3 wangwu = new Runner3(); wangwu.setName("王五"); //Future用于接收线程内部call方法的返回值 Future<Integer> result1 = executorService.submit(liuxiang); Future<Integer> result2 = executorService.submit(zhangsan); Future<Integer> result3 = executorService.submit(lisi); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } executorService.shutdown();//关闭线程池释放资源 System.out.println("刘翔跑了"+result1.get()+"米"); System.out.println("张三跑了"+result2.get()+"米"); System.out.println("李四跑了"+result3.get()+"米"); } } class Runner3 implements Callable<Integer> { private String name; public void setName(String name){ this.name = name; } //实现Callable接口的call方法允许有返回值和抛出异常 @Override public Integer call() throws Exception { Integer speed = new Random().nextInt(100); Integer distance = 0; for (int i = 1; i <= 100; i++) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } distance = speed * i; System.out.println(this.name+"跑了"+distance+"米("+speed+"米/秒)"); } return distance; } }

结果:

 

2|0 创建线程的三种方式的对比

 


__EOF__

本文作者blanset
本文链接https://www.cnblogs.com/blanset/p/16774371.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   求道之愚者  阅读(447)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示