关于我们
技术分享
技术分享
Java多线程的几种写法
Java多线程的几种写法
2021-04-28
Java多线程的在开发中用到的很多,简单总结一下几种写法,分别是继承Thread方法,实现Runnable接口,实现Callable接口;
1.继承Thread方法
class TestThread extends Thread{ String name; public TestThread(String name){ this.name=name; } @Override public void run() { for (int i = 0; i < 6; i++) { System.out.println(this.name+":"+i); } } }
main方法调用:
Thread启动有两个方法,一个是start()方法,一个是run()方法,但是直接调用run方法时线程不会交替运行,而是顺序执行,只有用start方法时才会交替执行
TestThread tt1 = new TestThread("A"); TestThread tt2 = new TestThread("B"); tt1.start(); tt2.start();
运行结果:
2.实现Runnable接口,有多种写法
2.1外部类
class TestRunnable implements Runnable{ String name; public TestRunnable(String name){ this.name=name; } @Override public void run() { for (int i = 0; i < 6; i++) { System.out.println(this.name+":"+i); } } }
调用:
TestRunnable tr1 = new TestRunnable("C"); TestRunnable tr2 = new TestRunnable("D"); new Thread(tr1).start(); new Thread(tr2).start();
2.2匿名内部类方式
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start();
2.3 Lamda表达式,jdk1.8,只要是函数式接口,都可以使用Lamda表达式或者方法引用
new Thread(()->{ for (int i = 0; i < 6; i++) { System.out.println(i); } }).start();
2.4ExecutorService创建线程池的方式
class TestExecutorService implements Runnable{ String name; public TestExecutorService(String name){ this.name=name; } @Override public void run() { for (int i = 0; i < 6; i++) { System.out.println(this.name+":"+i); } } }
调用:可以创建固定个数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2); TestExecutorService tes1 = new TestExecutorService("E"); TestExecutorService tes2 = new TestExecutorService("F"); pool.execute(tes1); pool.execute(tes2); pool.shutdown();
运行结果跟2.1差不多
3.实现Callable接口,可以返回结果
//Callable<V>提供返回数据,根据需要返回不同类型 class TestCallable implements Callable<String>{ private int ticket = 5; @Override public String call() throws Exception { for (int i = 0; i < 5; i++) { if(this.ticket>0) System.out.println("买票,ticket="+this.ticket--); } return "票卖完了"; } }
调用:
Callable<String> tc = new TestCallable(); FutureTask<String> task = new FutureTask<String>(tc); new Thread(task).start(); try { System.out.println(task.get());//获取返回值 } catch (InterruptedException | ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); }
运行结果:
- 标签:
-
容灾备份
您可能感兴趣的新闻 换一批
热门文章
现在下载,可享30天免费试用