線程的創建和啟動
1.繼承Thread來創建線程
public class Demo extends Thread
{
private xx;
public void run()
{
//這個線程要執行的東西
.......
}
public static void main(String []__)
{
Demo th=new Demo();
th.start();
}
}
這樣就算是創建了一個線程
兩個方法介紹
- Thread中的currentThread(),返回當前正在運行的線程
- getName(),返回線程名字
- 創建的時候,傳遞進去string類型的參數當做線程名字
2.實現Runnable類來作為參數傳遞
class A extends Runnable
{
private int age;//共同的field
public void run()
{
....
}
public static void main(String[]__)
{
A paremeter = new A();
Thread test=new Thread(paremeter);
test.start();
Thread other=new Thread(paremeter);
other.start();
//如果我們的run里面對於共享的變量age做出了修改,其實這兩個線程中,field是相同的,可能會造成共享的數據出現訪問沖突,可以考慮使用volatile關鍵字
}
}
3.使用Callable和Future來創建線程(jdk1.5加入)
步驟如下:
- 創建callable接口的實現類,並且實現call()方法,這個call()方法將作為線程的執行體
- 創建實現類的實例,使用Futuretask類來保證Callable對象,這個FutureTask對象封裝了該Callable對象call方法的返回值,也就是線程的執行體可以有返回值了
- 將FutureTask對象作為thread的target,創建並且啟動線程。
- 使用 FutureTask對象的get方法獲得子線程執行結束之后返回的數值
package thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableDemo implements Callable<Integer>
{
@Override
public Integer call() throws Exception {
int i=0;
for(;i<99;i++)
{
System.out.println(i+" "+Thread.currentThread().getName());
}
return i;
}
public static void main(String[]__)
{
//創建callable對象
CallableDemo rt=new CallableDemo();
//把callable綁定到FutureTask對象上面
FutureTask<Integer> task=new FutureTask<>(rt);
//把任務加入thread的target中去
new Thread(task).start();
try {
System.out.println(task.isDone()+" "+task.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
new Thread(task).start();
try {
System.out.println(task.isDone()+" "+task.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
//他們的field也是只有一塊,一個線程跑完會修改field中的數值
}
}
優點:
- 具有返回值
- 可以拋出異常
缺點:
- 使用get方法得到返回值可能拋出異常,線程可能沒有執行完畢
- get()方法會阻塞主線程,直到all方法返回
4.匿名方式創建線程(與Runnable同)
new Thread(new Runnable() {
private int i=0;
@Override
public void run() {
System.out.println(i);
}
},String.valueOf("1")).start();
優點:
- 方便快捷
缺點:
- 復用性低