為什么需要多線程?
模型的簡(jiǎn)化,如某些程序是由多個(gè)相對(duì)獨(dú)立任務(wù)的運(yùn)行:
圖形界面的出現(xiàn),輸入、輸出的阻塞
多核CPU的更好利用
異步行為的需要
Java多線程的特性:
程序的入口main本身是一個(gè)線程
線程是并發(fā)的,無(wú)序執(zhí)行的
線程內(nèi)部是順序執(zhí)行的
共享數(shù)據(jù)
Java多線程的風(fēng)險(xiǎn):
安全風(fēng)險(xiǎn):由于線程的操作順序是不確定的,某些在單線程下能運(yùn)行的程序到多線程下會(huì)出現(xiàn)意外的結(jié)果。
性能風(fēng)險(xiǎn):服務(wù)器的吞吐量、響應(yīng)性、資源消耗
Java多線程API:
Java可以通過(guò)兩種形式創(chuàng)建線程:一、實(shí)現(xiàn)Runnable接口,二、繼承Thread類(lèi)。
繼承thread創(chuàng)建線程示例代碼
public class ThreadTest extends Thread {
public static void main(String[] args) {
ThreadTest thread = new ThreadTest();
thread.start();
for (int i=0; i<10; i++) {
System.out.println("main:"+i);
}
}
@Override
public void run() {
for (int i=0; i<10; i++) {
System.out.println("thread:"+i);
}
}
}
實(shí)現(xiàn)runnable創(chuàng)建線程代碼
package com.openrdp.thread.api;
public class RunnableTest implements Runnable {
public static void main(String[] args) {
RunnableTest runnable = new RunnableTest();
Thread thread = new Thread(runnable);
thread.start();
for (int i=0; i<10; i++) {
System.out.println("main:"+i);
}
}
@Override
public void run() {
for (int i=0; i<10; i++) {
System.out.println("thread:"+i);
}
}
}
Java線程池技術(shù)
Executors獲取exceuctorservice線程池代碼
package com.openrdp.thread.api;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TreadPoolTest {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(99);
TaskThread thread1 = new TaskThread("t1");
threadPool.execute(thread1);
TaskThread thread2 = new TaskThread("t2");
threadPool.execute(thread2);
}
static class TaskThread implements Runnable {
String param;
public TaskThread(String param) {
this.param = param;
}
@Override
public void run() {
}
}
}