关于java中创建线程的方式的总结
Java  /  管理员 发布于 8年前   195
1、继承Thread类
public class ThreadCreator extends Thread{ public static void main(String[] args) { //第一种方式: ThreadCreator creator = new ThreadCreator(); Thread thread = new Thread(creator,"线程1"); thread.start(); //第二种方式: Thread thread = new ThreadCreator(); thread.start(); //第三种方式: new ThreadCreator().start(); } @Override public void run() { System.out.println(Thread.currentThread().getName() + "run"); }}
2、实现Runnable接口
(免费学习视频教程分享:java视频教程)
public class ThreadCreator implements Runnable{ public static void main(String[] args) { ThreadCreator creator = new ThreadCreator(); Thread thread = new Thread(creator,"线程1"); thread.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName() + "run"); }}
3、实现Callable接口
public class ThreadCreator implements Callable<Integer> { public static void main(String[] args) throws ExecutionException, InterruptedException { ThreadCreator creator = new ThreadCreator(); FutureTask futureTask = new FutureTask(creator); Thread thread = new Thread(futureTask,"线程"); thread.start(); System.out.println(futureTask.get()); } @Override public Integer call() { return 1024; }}
4、线程池ExecutorService
public class ThreadCreator{ static ExecutorService service = Executors.newFixedThreadPool(5); public static void main(String[] args) throws ExecutionException, InterruptedException { //execute无返回值 service.execute(new ThreadTask(1,"1")); //submit有返回值 Future<Integer> result = service.submit(new ThreadTaskCall()); System.out.println(result.get()); service.shutdownNow(); } static class ThreadTask implements Runnable{ private int param1; private String param2; public ThreadTask(int param3,String param4){this.param1 = param3;this.param2 = param4; } @Override public void run() {System.out.println(param1+param2); } } static class ThreadTaskCall implements Callable<Integer>{ @Override public Integer call() throws Exception {return 1024; } }}
线程池中submit和execute的区别:
(1)可接受的任务类型不一样:execute只能接受Runnable任务,submit还可以接受Callable任务。
(2)返回值:execute无返回值,任务一旦提交,无法在当前线程中监控执行结果。submit有一个Future类型的返回值,用来接收返回值或响应异常。通过get()方法获取。
submit底层还是调用的execute,只是在此基础上用future封装了一层,并将执行过程中产生的异常全部封装在一个变量中:
public void run() { if (state != NEW ||!UNSAFE.compareAndSwapObject(this, runnerOffset, null, Thread.currentThread()))return; try {Callable<V> c = callable;if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result);} } finally {runner = null;int s = state;if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } }protected void setException(Throwable t) { if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {outcome = t;UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final statefinishCompletion(); } }
另外,spring中的schedule注解借鉴使用了submit的处理方式。
5、匿名内部类
public class ThreadCreator { public static void main(String[] args) { //继承Thread类 new Thread() {@Overridepublic void run() { System.out.println("extends Thread Class!");} }.start(); //实现Runnable接口 new Thread(new Runnable() {@Overridepublic void run() { System.out.println("implement Runnable!");} }).start(); //实现Callable接口 new Thread(new FutureTask<Integer>(new Callable() {@Overridepublic Integer call() throws Exception { return 1024;} })).start(); //lambda表达式 new Thread(() -> System.out.println("execute single code")).start(); new Thread(() -> {System.out.println("execute multiple code"); }).start(); }}
lambda线程池:
public class ThreadCreator { static ExecutorService service = Executors.newFixedThreadPool(5); static List list = new ArrayList(); public static void main(String[] args) { service.execute(() -> execute()); //无返回值 Future future = service.submit(() -> execute()); //有返回值 list.add(future); } public static void execute() { //do something }}
推荐相关文章教程:java快速入门
以上就是关于java中创建线程的方式的总结的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号