博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小议创建线程的若干方式
阅读量:2165 次
发布时间:2019-05-01

本文共 3855 字,大约阅读时间需要 12 分钟。

创建线程的几种方式

  • 通过实现Runnable接口的run方法
    • 1.继承Runnable接口,重写run方法
    • 2.实例化实现后Runnable子类,调用run方法
    • 3.例子
    package com.myd.cn.createThreadWay;public class RunnableWay {	/**	 *1.实现Runnable的子类	 * @author dymll	 *	 */	public static class RunnableThread implements Runnable{		@Override		public void run() {			System.out.println(" Runnable subClass running --- ");		}	}	public static void main(String[] args) {		//2.实例化子类		Runnable runable = new RunnableThread();		//3.子类实例调用start()方法		runable.run();	}}
  • 继承Thread类,重新run方法,调用start启动线程
    • 1.继承Thread类,重写run方法
    • 2.实例化继承后的子类,然后调用start()方法
    • 3.例子
    package com.myd.cn.createThreadWay;	public class ThreadWay {		/**		 * 1.继承Thread的子类		 * @author dymll		 *		 */		public static class ThreadDemo extends Thread{			@Override			public void run() {				super.run();				System.out.println(" Thread subClass running --- ");			}		}		public static void main(String[] args) {				//2.实例化子类				Thread threadDemo = new ThreadDemo();				//3.子类实例调用start()方法				threadDemo.start();		}	}
  • 通过Callable和FutureTask创建线程
    • 1.实现Callable接口,重新call方法
    • 2.实例化已重写传入Callable对象,构造FutureTask(Runnable的子类)对象
    • 3.传入FutureTask对象构造Thread对象,启动线程
    • 4.例子
      package com.myd.cn.createThreadWay;	import java.util.concurrent.Callable;	import java.util.concurrent.ExecutionException;	import java.util.concurrent.FutureTask;	public class CallableThread {		/**		 * 1.实现Class接口,创建静态内部类		 * @author dymll		 *		 */		public static class Mycallable implements Callable
      { @Override public String call() throws Exception { System.out.println("正在调用"); return "calling"; } } public static void main(String[] args) throws InterruptedException, ExecutionException { //2.实例化Callable对象 Callable
      callable = new Mycallable(); //3.传入Callable对象,进行构造FutureTask(Runnable的子类)对象 FutureTask
      futureTask = new FutureTask<>(callable); //4.传入FutureTask对象 new Thread(futureTask).start(); //5.使用FutureTask获取线程执行结果 String result = futureTask.get(); System.out.println("result = "+result); } }
  • 使用线程池,将Runnable或Callable放入线程池ExecutorService中执行
    • 1.实现Callable/Runnable接口,重写call/run方法
    • 2.构建ExecutorService线程池对象,调用线程池execute/submit方法执行线程
    • 3.对于submit方式提交,使用Future来获取执行结果
    • 4.例子
      package com.myd.cn.createThreadWay;	import java.util.concurrent.Callable;	import java.util.concurrent.ExecutionException;	import java.util.concurrent.ExecutorService;	import java.util.concurrent.Executors;	import java.util.concurrent.Future;	public class ThreadPoolWay {		public static void main(String[] args) throws InterruptedException, ExecutionException {			ExecutorService executorService = Executors.newFixedThreadPool(2);			//2.实例化Runnable子类,Callable子类			Runnable cusRunable = new CusRunnable();			Callable
      cusCallable = new CusCallable(); //3.提交线程到线程池,以submit方式提交 Future runnableFuture = executorService.submit(cusRunable); //获取执行结果,并打印 Object furuteObject = runnableFuture.get(); System.out.println("furuteObject is "+furuteObject); Future
      callableFuture = executorService.submit(cusCallable); //void类型的run方法无返回值 String result = callableFuture.get(); System.out.println("callableFuture is "+callableFuture); } /** * 实现Callable接口 call方法,返回线程执行结果 * @author dymll * */ public static class CusCallable implements Callable
      { @Override public String call() throws Exception { System.out.println("CusCallable is Calling"); return "calling"; } } public static class CusRunnable implements Runnable{ @Override public void run() { System.out.println("CusRunnable is running"); } } }

如果获取线程执行的结果

- 1.实现Callable接口并重写call方法后的子类实例化后,传入FutureTask,FutureTask实例化后,传入Thread实例化后对象,然后FutureTask实例调用get方法后去线程执行结果- 2.看FutureTask的run方法- 3.FutureTask会维护线程的状态,在未完成时会一直等待,直到完成- 4.FutureTask会把结果和异常信息存储在对象内部变量中- 5.FutureTask支持超时获取结果,指定具体等待时间

转载地址:http://nhjzb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】67-Add Binary
查看>>
【LEETCODE】7-Reverse Integer
查看>>
【LEETCODE】165-Compare Version Numbers
查看>>
【LEETCODE】299-Bulls and Cows
查看>>
【LEETCODE】223-Rectangle Area
查看>>
【LEETCODE】12-Integer to Roman
查看>>
【学习方法】如何分析源代码
查看>>
【LEETCODE】61- Rotate List [Python]
查看>>
【LEETCODE】143- Reorder List [Python]
查看>>
【LEETCODE】82- Remove Duplicates from Sorted List II [Python]
查看>>
【LEETCODE】86- Partition List [Python]
查看>>
【LEETCODE】147- Insertion Sort List [Python]
查看>>
【算法】- 动态规划的编织艺术
查看>>
用 TensorFlow 让你的机器人唱首原创给你听
查看>>
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
查看>>
深度学习的主要应用举例
查看>>
word2vec 模型思想和代码实现
查看>>
怎样做情感分析
查看>>
用深度神经网络处理NER命名实体识别问题
查看>>
用 RNN 训练语言模型生成文本
查看>>