java創建線程的方式有幾種?這篇文章運用了實例代碼展示,代碼非常詳細,可供感興趣的小伙伴們參考借鑒,希望對大家有所幫助。
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 state
finishCompletion();
}
}另外,spring中的schedule注解借鑒使用了submit的處理方式。
5、匿名內部類
public class ThreadCreator {
public static void main(String[] args) {
//繼承Thread類
new Thread() {
@Override
public void run() {
System.out.println("extends Thread Class!");
}
}.start();
//實現Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("implement Runnable!");
}
}).start();
//實現Callable接口
new Thread(new FutureTask<Integer>(new Callable() {
@Override
public 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創建線程的方式匯總,內容較為全面,小編相信有部分知識點可能是我們日常工作可能會見到或用到的。希望你能通過這篇文章學到更多知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。