done like this:html
Thread thread = new Thread();
thread.start();
複製代碼
public MyThread extends Thread{
@Override
public void run() {
System.out.println("Hello, World!");
}
}
複製代碼
public MyRunnable implements Runnable{
public void run() {
System.out.println("all so have to say hello, world!");
}
}
複製代碼
Runnable myRunnable = new Runnable() {
public void run() {
System.out.println("Hello, World!");
}
};
複製代碼
Runnable myRunable = {
System.out.println("Hello, World!");
};
複製代碼
經過實現接口的方式,可以讓代碼書寫更加精簡。能夠經過Lambda來簡化代碼。實現接口的方式可以有效分離業務邏輯與線程運行代碼,能讓線程池有效管理和調度任務,在線程池繁忙時進入隊列等待線程池調度。這種方式可以迎合工做者模型。java
有時候能夠結合兩種方式來使用,最典型的表明就是實現一個線程池。多線程
Thread newThread = new Thread(MyRunnable());
newThread.run(); //should be start();
複製代碼
僅執行run方法,並不會建立新的線程,而是在本線程來執行run方法裏面的業務邏輯。切記建立一個新的線程,必定要執行start方法而非run方法。jvm
每每爲了區分哪一個線程在運行,會經過System.out的方式來打印線程名稱。經過繼承Thread的方式能夠直接經過Thread的getName方法來打印名稱。經過實現的方式並無getName方法,此時能夠經過Thread的靜態方法currentThread來取得當前線程引用。ide
在建立線程時,能夠經過Thread的構造方法傳遞線程名稱;post
Thread myThread = new Thread("our-thread0") {
@Override
public void run() {
System.out.println("run by: " + getName());
}
};
Runnable myRunnable = () -> {
final Thread currentThread = Thread.currentThread();
System.out.println("run by: " + currentThread.getName());
};
myThread.start();
new Thread(myRunnable, "our-thread1").start();
複製代碼
public class ThreadExample {
private static void startThread(int i) {
new Thread("thread: " + i) {
@Override
public void run() {
System.out.println(getName() + " running.");
}
}.start();
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
IntStream.range(0, 10)
.forEach(ThreadExample::startThread);
}
}
複製代碼
如你所見,以上實例中,順序建立並執行10個線程,但線程的運行並不必定是順序,此時10個線程是並行執行的,線程的執行順序是由jvm和操做系統共同決定的。this
try {
// 當前線程睡眠 10 s
Thread.sleep(10L * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
複製代碼
能夠經過Thread.sleep()方法,經過傳遞毫秒數來暫停線程。暫停時長以傳遞毫秒數爲準。spa
Thread對象中默認包含了stop(),pause()等方法。但已經被廢棄了,默認的stop()方法並不能保證線程在何種狀態下被中止。這意味着,全部被線程訪問到的java對象都將在一個未知的狀態下運行。若是其餘線程須要訪問相同的對象,那麼你的應用將會出現不可預測的失敗。操作系統
public class ThreadStopExample implements Runnable {
// 是否中止
private boolean doStop = false;
// 繼續運行線程
public synchronized boolean keepRunning() {
return !doStop;
}
// 中止線程
public synchronized void stop() {
this.doStop = true;
}
@Override
public void run() {
while (keepRunning()) {
System.out.println("Running");
try {
// 暫停 3 s
Thread.sleep(3L * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
final ThreadStopExample threadStopExample = new ThreadStopExample();
new Thread(threadStopExample, "our thread").start();
try {
// 10 s 後中止線程
Thread.sleep(10L * 1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
threadStopExample.stop();
}
}
複製代碼
該系列博文爲筆者複習基礎所著譯文或理解後的產物,複習原文來自Jakob Jenkov所著Java Concurrency and Multithreading Tutorial 線程