大家好,欢迎来到IT知识分享网。
本文主要讲述:多线程工具类之5种实现方式。
众所周知,为提高程序执行效率和资源利用率,我们需要使用到多线程。
应用场景主要是:高并发;异步处理;定时任务;网络爬虫;网络编程等等。
而实现多线程有5种方式。
1、继承Thread类,重写run方法
2、实现Runnable接口
3、实现Callable接口
3、使用定时器
4、创建线程池
下面将分享这5种实现方式的具体实例。
一、继承Thread类
public class Thread1 extends Thread { @Override public void run() { for(int i = 1; i < 100; i++){ System.out.println("线程1运行了" + i + "次"); } } public static void main(String[] args) { //开启线程1 Thread1 thread1 = new Thread1(); thread1.start(); //开启主线程 for(int i = 1; i < 100; i++){ System.out.println("主线程线程运行了" + i + "次"); } } } 运行结果:
二、实现Runnable接口
public class Thread1 implements Runnable { @Override public void run() { for(int i = 1; i < 100; i++){ System.out.println("线程1运行了" + i + "次"); } } public static void main(String[] args) { //开启线程1 Thread1 thread1 = new Thread1(); new Thread(thread1).start(); //开启主线程 for(int i = 1; i < 100; i++){ System.out.println("主线程线程运行了" + i + "次"); } } } 运行结果:
继承Thread类和实现Runnable接口,去实现多线程,代码是非常类似的,但是Runnable会更胜一筹,因为它可以破除java单继承的限制,并且能够增加代码的健壮性。
三、实现Callable接口
public class Thread1 { //使用Callable创建线程计算100以内的奇数 public static void main(String[] args) throws Exception { Callable<Integer> callable = new Callable<Integer>() { @Override public Integer call() { int sum = 0; for (int i = 1; i <= 100; i++) { sum += i % 2 == 0 ? 0 : i; } return sum; } }; FutureTask<Integer> task = new FutureTask<>(callable); Thread t = new Thread(task); t.start(); System.out.println(task.get()); } } 输出:2500四、使用定时器
public class Thread1 extends TimerTask { private int id; public Thread1(int id){ this.id = id; } @Override public void run() { System.out.println("线程" + id + "执行了一次"); } public static void main(String[] args){ Timer timer = new Timer(); //线程1:3秒后开始执行,1秒钟执行一次 timer.schedule(new Thread1(1), 1000,3000); //线程2:2秒后立即执行,1秒钟执行一次 timer.schedule(new Thread1(2), 1000,2000); } } 输出结果:
五、创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.execute(() -> { System.out.println("线程1执行开始..."); Thread.sleep(3000); System.out.println("线程1执行结束..."); }); executorService.execute(() -> { System.out.println("线程2执行开始"); Thread.sleep(1000); System.out.println("线程2执行结束"); }); executorService.shutdown(); 执行结果: 线程1执行开始... 线程2执行开始 线程2执行结束 线程1执行结束...感谢您的阅读,祝你生活愉快,永无加班~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/97630.html