常见的Java线程的4种创建方式:
Thread类实现Runnable接口并定义了操作线程的一些方法,可以通过继承thread类的方式创建一个线程。
具体代码如下:
(1)通过继承thread类创建NewThread线程:
public class NewThread extends Thread { public void run(){ //具体业务逻辑实现 System.out.println("创建一个新线程"); } }
(2)实例化Newthread并启动:
public class Main { public static void main(String[] args) { NewThread newThread = new NewThread(); newThread.start(); } }
创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。为了实现 Runnable,一个类只需要执行一个方法调用 run()。
具体代码如下:
(1)通过实现Runnable接口的方式创建MyRunnable线程:
public class MyRunnable implements Runnable{ public void run() { System.out.println("通过Runnable创建一个线程"); } }
(2)实例化MyRunnable对象,并创建一个线程对象传入已经实例化MyRunnable实例:
public class Main { public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); } }
在主线程中开启多个线程并发执行一个任务,收集各个线程执行返回的结果并将最终结果汇总起来,就应该使用Callable接口。
具体代码如下:
(1)通过Callable接口创建MyCallable线程:
import java.util.concurrent.Callable; public class MyCallable implements Callable<String> { private String name; public MyCallable(String name){ this.name = name; }; public String call() throws Exception { //call方法内实现逻辑 return name; } }
(2)创建一个线程池接收MyCallable实例:
public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { //创建一个固定大小为5的线程池 ExecutorService pool = Executors.newFixedThreadPool(5); //创建多个有返回值的任务列表 List<Future> list = new ArrayList<Future>(); for (int i = 0; i < 5; i++) { //创建一个有返回值的线城实例 Callable callable = new MyCallable(i + ""); //提交线程,获取Future对象 Future future = pool.submit(callable); System.out.println("提交Callable线程" + i); list.add(future); } pool.shutdown(); for (Future future:list) { System.out.println("获得Callable线程结果"+future.get().toString()); } } }
结果:
提交Callable线程0
提交Callable线程1
提交Callable线程2
提交Callable线程3
提交Callable线程4
获得Callable线程结果0
获得Callable线程结果1
获得Callable线程结果2
获得Callable线程结果3
获得Callable线程结果4
为了避免浪费线程资源,可以使用线程池来创建线程。
具体代码如下:
package com.jzq.concurrent.Thread.ThreadPool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPool { public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(7); //提交多个线程任务并执行 for (int i = 0; i < 7; i++) { threadPool.execute(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName()+"在运行"); } } ); } } }
结果:
pool-1-thread-1在运行 pool-1-thread-4在运行 pool-1-thread-3在运行 pool-1-thread-2在运行 pool-1-thread-5在运行 pool-1-thread-6在运行 pool-1-thread-7在运行
原文:https://www.cnblogs.com/strong-FE/p/12177901.html