Java創(chuàng)建線程依賴java.lang.Thread類(lèi)
package com.wkcto.chapter07.newthread;
/**
* 演示創(chuàng)建線程的方式一
* 定義Thread類(lèi)的子類(lèi)
* @author 蛙課網(wǎng)
*
*/
public class Test01 {
public static void main(String[] args) {
//3)創(chuàng)建線程對(duì)象
SubThread t1 = new SubThread();
//4) 開(kāi)啟線程
t1.start(); //開(kāi)啟的線程會(huì)執(zhí)行run()方法
// t1.run(); //就是普通實(shí)例方法的調(diào)用, 不會(huì)開(kāi)啟新的線程
//當(dāng)前線程是main線程
for( int i = 1; i<=100; i++){
System.out.println( "main : " + i);
}
/*
* 每次運(yùn)行程序, 運(yùn)行的結(jié)果可能不一樣
* 運(yùn)行程序后, 當(dāng)前程序就有兩個(gè)線程main線程和t1線程在同時(shí)執(zhí)行, 這兩個(gè)線程中哪個(gè)線程搶到CPU執(zhí)行權(quán), 這個(gè)線程就執(zhí)行
*
* 在單核CPU中, 在某一時(shí)刻CPU只能執(zhí)行一個(gè)任務(wù), 因?yàn)镃PU執(zhí)行速度非常快, 可以在各個(gè)線程之間進(jìn)行快速切換
* 對(duì)于用戶來(lái)說(shuō), 感覺(jué)是多個(gè)線程在同時(shí)執(zhí)行
*
*/
}
}
//1)定義類(lèi)繼承Thread
class SubThread extends Thread{
//2)重寫(xiě)run(), run()方法中的代碼就是子線程要執(zhí)行的代碼
@Override
public void run() {
//在子線程中打印100行字符串
for( int i = 1; i<=100 ; i++){
System.out.println("sub thread -->" + i);
}
}
}
定義Runnable接口的實(shí)現(xiàn)類(lèi)
package com.wkcto.chapter07.newthread;
/**
* 創(chuàng)建線程的方式二
* 實(shí)現(xiàn)Runnable接口
* @author 蛙課網(wǎng)
*
*/
public class Test02 {
public static void main(String[] args) {
//3) 創(chuàng)建線程對(duì)象, 調(diào)用構(gòu)造方法 Thread(Runnable) , 在調(diào)用時(shí), 傳遞Runnable接口的實(shí)現(xiàn)類(lèi)對(duì)象
Prime p = new Prime(); //創(chuàng)建Runnable接口的實(shí)現(xiàn)類(lèi)對(duì)象
Thread t2 = new Thread(p);
//4) 開(kāi)啟線程
t2.start();
//通過(guò)Runnable接口匿名內(nèi)部類(lèi)的形式創(chuàng)建線程
Thread t22 = new Thread(new Runnable() {
@Override
public void run() {
for( int i = 1; i <= 100; i++){
System.out.println("t22==> " + i);
}
}
});
t22.start();
// 當(dāng)前線程是main線程
for (int i = 1; i <= 100; i++) {
System.out.println("main : " + i);
}
}
}
//1) 定義一個(gè)類(lèi)實(shí)現(xiàn)Runnable接口
class Prime implements Runnable{
//2)重寫(xiě)run()方法, run()方法中的代碼就是子線程要執(zhí)行的代碼
@Override
public void run() {
// 在子線程中打印100行字符串
for (int i = 1; i <= 100; i++) {
System.out.println("sub thread -->" + i);
}
}
}
定義Callable接口的實(shí)現(xiàn)類(lèi)
package com.wkcto.chapter07.newthread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 創(chuàng)建線程的方式三
* 實(shí)現(xiàn)Callable接口
* @author 蛙課網(wǎng)
*
*/
public class Test03 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//3)創(chuàng)建線程對(duì)象
Prime2 p2 = new Prime2(); //創(chuàng)建Callable接口的實(shí)現(xiàn)類(lèi)對(duì)象
FutureTask<Integer> task = new FutureTask<>( p2 ); //創(chuàng)建FutureTask對(duì)象
//FutureTask類(lèi)實(shí)現(xiàn)了RunnableFuture接口, 該接口繼承了Runnable接口, FutureTask類(lèi)就是Runnable接口的實(shí)現(xiàn)類(lèi)
Thread t3 = new Thread(task);
//4)開(kāi)啟線程
t3.start();
// 當(dāng)前線程是main線程
for (int i = 1; i <= 100; i++) {
System.out.println("main : " + i);
}
//在main線程中可以取得子線程的返回值
System.out.println(" task result : " + task.get() );
}
}
//1)定義類(lèi)實(shí)現(xiàn)Callable接口
//Callable接口的call()方法有返回值, 可以通過(guò)Callable接口泛型指定call()方法的返回值類(lèi)型
class Prime2 implements Callable<Integer> {
//2)重寫(xiě)call()方法, call()方法中的代碼就是子線程要執(zhí)行的代碼
@Override
public Integer call() throws Exception {
//累加1~100之間的整數(shù)和
int sum = 0 ;
for(int i = 1; i<=100; i++){
sum += i;
System.out.println("sum=" + sum);
}
return sum;
}
}