做中介最好用的网站,wordpress淘宝客采集,网络平台,长沙做网站的费用1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式#xff0c;但Thread本质上也是实现了Runnable接口的一个实例#xff0c;它代表一个线程的实例#xff0c;并且#xff0c;启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法… 1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式但Thread本质上也是实现了Runnable接口的一个实例它代表一个线程的实例并且启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法它将启动一个新线程并执行run()方法。这种方式实现多线程很简单通过自己的类直接extend Thread并复写run()方法就可以启动新线程并执行自己定义的run()方法。例如 public class MyThread extends Thread { public void run() { System.out.println(MyThread.run()); }
} 在合适的地方启动线程如下 MyThread myThread1 new MyThread(); MyThread myThread2 new MyThread(); myThread1.start(); myThread2.start(); 2、实现Runnable接口方式实现多线程 如果自己的类已经extends另一个类就无法直接extends Thread此时必须实现一个Runnable接口如下 public class MyThread extends OtherClass implements Runnable { public void run() { System.out.println(MyThread.run()); } } 为了启动MyThread需要首先实例化一个Thread并传入自己的MyThread实例 MyThread myThread new MyThread(); Thread thread new Thread(myThread); thread.start(); 事实上当传入一个Runnable target参数给Thread后Thread的run()方法就会调用target.run()参考JDK源代码 public void run() { if (target ! null) { target.run(); } } 3、使用ExecutorService、Callable、Future实现有返回结果的多线程 ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征确实很实用有了这种特征我就不需要再为了得到返回值而大费周折了而且即便实现了也可能漏洞百出。 可返回值的任务必须实现Callable接口类似的无返回值的任务必须Runnable接口。执行Callable任务后可以获取一个Future的对象在该对象上调用get就可以获取到Callable任务返回的Object了再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子在JDK1.5下验证过没问题可以直接使用。代码如下 package MavenTest.maven_demo_web;import java.util.concurrent.*;import java.util.Date;import java.util.List;import java.util.ArrayList;/*** 有返回值的线程*/public class Test {public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println(----程序开始运行----); Date date1 new Date(); int taskSize 5;//同时开启的线程数量 // 创建一个线程池 ExecutorService pool Executors.newFixedThreadPool(taskSize); // 创建多个有返回值的任务 ListFutureObject list new ArrayListFutureObject(); ListMyCallable listCallable new ArrayListMyCallable(); for (int i 0; i 10; i) { MyCallable callableTask new MyCallable(i ); listCallable.add(callableTask); }// 执行任务并获取Future对象 list pool.invokeAll(listCallable); // 关闭线程池 pool.shutdown(); // 获取所有并发任务的运行结果 for (Future f : list) { // 从Future对象上获取任务的返回值并输出到控制台 System.out.println( f.get().toString()); } Date date2 new Date(); System.out.println(----程序结束运行----程序运行时间【 (date2.getTime() - date1.getTime()) 毫秒】);}}class MyCallable implements CallableObject {private String taskNum;MyCallable(String taskNum) { this.taskNum taskNum;}public Object call() throws Exception { System.out.println( taskNum 任务启动); Date dateTmp1 new Date(); Thread.sleep(1000); Date dateTmp2 new Date(); long time dateTmp2.getTime() - dateTmp1.getTime(); System.out.println( taskNum 任务终止); return taskNum 任务返回运行结果,当前任务时间【 time 毫秒】;}} 代码说明 上述代码中Executors类提供了一系列工厂方法用于创先线程池返回的线程池都实现了ExecutorService接口。 public static ExecutorService newFixedThreadPool(int nThreads) 创建固定数目线程的线程池。 public static ExecutorService newCachedThreadPool() 创建一个可缓存的线程池调用execute 将重用以前构造的线程如果线程可用。如果现有线程没有可用的则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。 public static ExecutorService newSingleThreadExecutor() 创建一个单线程化的Executor。 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性的任务执行的线程池多数情况下可用来替代Timer类。 ExecutoreService提供了submit()方法传递一个Callable或Runnable返回Future。如果Executor后台线程池还没有完成Callable的计算这调用返回Future对象的get()方法会阻塞直到计算完成。 转载于http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html 转载于:https://www.cnblogs.com/zy-jiayou/p/7249858.html