目錄
- - 繼承Thread
- - 實作Runnable介面
- - 實作Callable介面
- - 使用執行緒池ThreadPoolExecutor
- 繼承Thread
繼承Thread類,重寫run方法實作多執行緒
package com.noneplus;
class Task1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task1輸出:" + i);
}
}
}
class Task2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(" Task2輸出:" + i);
}
}
}
/**
* @Description: 繼承Thread,重寫run方法,實作多執行緒
* @Author noneplus
* @Date 2020/8/3 17:34
*/
public class ExtendThread {
public static void main(String[] args) {
Task1 task1 = new Task1();
task1.start();
Task2 task2 = new Task2();
task2.start();
for (int i = 0; i < 10; i++) {
System.out.println(" mainTask輸出:" + i);
}
//3個執行緒的執行順序由CPU的執行緒調度決定
}
}
- 實作Runnable介面
Runnable介面解決了單繼承的問題
package com.noneplus;
class Task3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task1輸出:" + i);
}
}
}
class Task4 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(" Task2輸出:" + i);
}
}
}
/**
* @Description: 實作Runnable介面,實作多執行緒,彌補單繼承的問題
* @Author noneplus
* @Date 2020/8/3 17:34
*/
public class ImplementRunnable {
public static void main(String[] args) {
Task3 runnable3 = new Task3();
Task4 runnable4 = new Task4();
Thread task3 = new Thread(runnable3);
Thread task4 = new Thread(runnable4);
task3.start();
task4.start();
for (int i = 0; i < 10; i++) {
System.out.println(" " +
" mainTask輸出:" + i);
}
//3個執行緒的執行順序由CPU的執行緒調度決定
}
}
- 實作Callable介面
Callable支持回傳值(但用多執行緒加回傳值有點奇怪)
package com.noneplus;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class Task5 implements Callable {
@Override
public Integer call() throws Exception {
Integer i = 0;
for (; i < 10; i++) {
System.out.println("Task5輸出:" + i);
}
return i;
}
}
class Task6 implements Callable {
@Override
public Integer call() throws Exception {
Integer i = 0;
for (; i < 10; i++) {
System.out.println(" Task6輸出:" + i);
}
return i;
}
}
/**
* @Description: 實作Callable介面,可以定義回傳值
* @Author noneplus
* @Date 2020/8/3 17:53
*/
public class ImplementCallable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println(" mainTask輸出:" + i);
}
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Task5());
FutureTask<Integer> futureTask1 = new FutureTask<Integer>(new Task6());
Thread thread = new Thread(futureTask);
Thread thread1 = new Thread(futureTask1);
thread.start();
thread1.start();
System.out.println("任務回傳結果:"+futureTask.get());
System.out.println("任務回傳結果:"+futureTask1.get());
}
}
- 使用執行緒池ThreadPoolExecutor
package com.noneplus;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
class Task7 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task7輸出:" + i + "當前執行緒" + Thread.currentThread().getName());
}
}
}
class Task8 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Task8輸出:" + i + "當前執行緒" + Thread.currentThread().getName());
}
}
}
/**
* @Description: 使用執行緒池創建執行緒池,實作執行緒復用和管理
* @Author noneplus
* @Date 2020/8/5 15:38
*/
public class ThreadPool {
public static void main(String[] args) {
/**
* 阿里推薦:ThreadPoolExecutor
* ```
* public ThreadPoolExecutor(int corePoolSize,
* int maximumPoolSize,
* long keepAliveTime,
* TimeUnit unit,
* BlockingQueue<Runnable> workQueue)
* ```
* 1、corePoolSize 核心執行緒數大小,當執行緒數 < corePoolSize ,會創建執行緒執行 runnable
*
* 2、maximumPoolSize 最大執行緒數, 當執行緒數 >= corePoolSize的時候,會把 runnable 放入 workQueue中
*
* 3、keepAliveTime 保持存活時間,當執行緒數大于corePoolSize的空閑執行緒能保持的最大時間,
*
* 4、unit 時間單位
*
* 5、workQueue 保存任務的阻塞佇列
*
* 6、threadFactory 創建執行緒的工廠
*
* 7、handler 拒絕策略
*
*/
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3));
for (int i=0;i<10;i++)
{
threadPoolExecutor.execute(new Task7());
threadPoolExecutor.execute(new Task8());
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100229.html
標籤:Java
上一篇:阿里、位元組等大佬重磅出盡,整理面試題助力金九銀十,還不收藏
下一篇:這個程式運行不了
