java实现多线程的几种方式,java多线程实现
以下四种方式:
1.继承Thread类,重写run方法。2.实现Runnable接口,重写run方法,将Runnable接口实现类的instance对象实现为线程构造器的target3。3.通过Callable和FutureTask创建一个线程。4.通过线程池创建一个线程。后面两种可以归结成一类:有返回值。通过可调用接口,调用方法应该被实现。这个方法的返回值是Object,所以返回的结果可以放在Object对象中。
第一种:继承Thread类,重写该类的run()方法。
类MyThread扩展Thread { private int I=0;@ Override public void run(){ for(I=0;i 100I){ system . out . println(thread . current thread()。getName() I);} } }公共类thread demo 1 { public static void main(String[]args){ for(int I=0;i 100I){ system . out . println(thread . current thread()。getName() I);If (i==30) {//创建一个新线程myThread1。该线程进入新状态Thread myth read 1=new myth read();//创建一个新线程myThread2。该线程进入新状态Thread myth read 2=new myth read();//调用start()方法使线程进入就绪状态mythread 1 . start();//调用start()方法使线程进入就绪状态mythread 2 . start();}}}}如上图,继承了Thread类,通过重写run()方法定义了一个新的线程类MyThread,其中run()方法的方法体表示线程需要完成的任务,称为线程执行器。当这个线程类对象被创建时,一个新线程被创建,一个新线程被创建。通过调用线程对象引用的start()方法,线程进入就绪状态。此时,线程可能不会立即执行,这取决于CPU调度的时机。
在第二种:实现Runnable接口,并重写该接口的run()方法。,创建Runnable实现类的一个实例,并使用这个实例作为Thread类的目标来创建Thread对象,这是真正的Thread对象。
MyRunnable类实现Runnable { private int I=0;@ Override public void run(){ for(I=0;i 100I){ system . out . println(thread . current thread()。getName() I);} } }公共类thread demo 2 { public static void main(String[]args){ for(int I=0;i 100I){ system . out . println(thread . current thread()。getName() I);If (i==30) {//创建一个Runnable实现类的对象Runnable my Runnable=new my Runnable();//创建一个新线程Thread Thread 1=new Thread(myRunnable)以my runnable为线程目标;Thread thread2=新线程(my runnable);//调用start()方法使线程进入就绪状态threa。
d1.start(); thread2.start(); } } }}第三种:使用Callable和Future接口创建线程。
1:创建Callable接口的实现类 ,并实现Call方法2:创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask
对象封装了Callable对象的Call方法的返回值3:使用FutureTask对象作为Thread对象的target创建并启动线程4:调用FutureTask对象的get()来获取子线程执行结束的返回值
public class ThreadDemo3 { public static void main(String[] args) { // 创建MyCallable对象 Callable<Integer> myCallable = new MyCallable(); //使用FutureTask来包装MyCallable对象 FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if (i == 30) { //FutureTask对象作为Thread对象的target创建新的线程 Thread thread = new Thread(ft); //线程进入到就绪状态 thread.start(); } } System.out.println("主线程for循环执行完毕.."); try { //取得新创建的新线程中的call()方法返回的结果 int sum = ft.get(); System.out.println("sum = " + sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }}class MyCallable implements Callable<Integer> { private int i = 0; // 与run()方法不同的是,call()方法具有返回值 @Override public Integer call() { int sum = 0; for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); sum += i; } return sum; }}首先,我们发现,在实现
Callable
接口中,此时不再是run()方法了,而是call()方法,此call()
方法作为线程执行体,同时还具有返回值!在创建新的线程时,是通过FutureTask
来包装MyCallable
对象,同时作为了Thread
对象的target。第四种:通过线程池创建线程。
public class ThreadDemo4{ //线程池数量 private static int POOL_NUM = 10; /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub ExecutorService executorService = Executors.newFixedThreadPool(5); for(int i = 0; i<POOL_NUM; i++) { RunnableThread thread = new RunnableThread(); //Thread.sleep(1000); executorService.execute(thread); } //关闭线程池 executorService.shutdown(); }}class RunnableThread implements Runnable { @Override public void run() { System.out.println("通过线程池方式创建的线程:" + Thread.currentThread().getName() + " "); }}
ExecutorService
、Callable
都是属于Executor
框架。返回结果的线程是在JDK1.5中引入的新特征,还有Future接口也是属于这个框架,有了这种特征得到返回值就很方便了。通过分析可以知道,他同样也是实现了Callable
接口,实现了Call方法,所以有返回值。这也就是正好符合了前面所说的两种分类执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable
任务返回的Object了。get方法是阻塞的,即:线程无返回结果,get方法会一直等待。
到此这篇关于分享Java多线程实现的四种方式的文章就介绍到这了,更多相关Java多线程内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。