線程用到Thread或者Runnable接口(Thread也操作了Runnable接口)
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、網(wǎng)站制作與策劃設(shè)計,當(dāng)陽網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:當(dāng)陽等地區(qū)。當(dāng)陽做網(wǎng)站價格咨詢:18982081108
繼承了Thread類后需要重載其run方法,在方法里寫你需要完成的事情,開始線程是調(diào)用其start方法。
操作Runnable接口必須實現(xiàn)其run方法,在方法里寫你需要完成的事情,Runnable接口沒有start方法,所以啟動線程還是需要依靠Thread類 new Thread(Runnable runnable).start();
一般項目中多是操作接口,因為類只能單繼承,接口可以操作多個。
繼承Thread類來實現(xiàn)多線程:
當(dāng)我們自定義的類繼承Thread類后,該類就為一個線程類,該類為一個獨立的執(zhí)行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。
run方法中定義的代碼為線程代碼,但run方法不能直接調(diào)用,如果直接調(diào)用并沒有開啟新的線程而是將run方法交給調(diào)用的線程執(zhí)行
要開啟新的線程需要調(diào)用Thread類的start()方法,該方法自動開啟一個新的線程并自動執(zhí)行run方法中的內(nèi)容
? ? ?
請點擊輸入圖片描述
結(jié)果: ? ? ? ? ? ?
? ? ?
請點擊輸入圖片描述
*java多線程的啟動順序不一定是線程執(zhí)行的順序,各個線程之間是搶占CPU資源執(zhí)行的,所有有可能出現(xiàn)與啟動順序不一致的情況。
CPU的調(diào)用策略:
如何使用CPU資源是由操作系統(tǒng)來決定的,但操作系統(tǒng)只能決定CPU的使用策略不能控制實際獲得CPU執(zhí)行權(quán)的程序。
線程執(zhí)行有兩種方式:
1.搶占式:
目前PC機中使用最多的一種方式,線程搶占CPU的執(zhí)行權(quán),當(dāng)一個線程搶到CPU的資源后并不是一直執(zhí)行到此線程執(zhí)行結(jié)束,而是執(zhí)行一個時間片后讓出CPU資源,此時同其他線程再次搶占CPU資源獲得執(zhí)行權(quán)。
2.輪循式;
每個線程執(zhí)行固定的時間片后讓出CPU資源,以此循環(huán)執(zhí)行每個線程執(zhí)行相同的時間片后讓出CPU資源交給下一個線程執(zhí)行。
java中多線程的實現(xiàn)方式有兩種,一種是繼承java.lang.Thread類,另一種是實現(xiàn)java.lang.Runnable接口。下面是兩種方式的簡單代碼。繼承Thread類方式:import java.lang.Thread; //用集成Thread類方式實現(xiàn)多線程。 public class Test{ public static void main(String arg[]){ T t1=new T(); T t2=new T(); //更改新線程名稱 t1.setName("t1"); t2.setName("t2"); //啟動線程 t1.start(); t2.start(); } } class T extends Thread{ //重寫run()方法 public void run(){ System.out.println(this.getName()); } }輸出結(jié)果為:t1t2實現(xiàn)Runnable接口方式:在使用Runnable接口時需要建立一個Thread實例。因此,無論是通過Thread類還是Runnable接口建立線程,都必須建立Thread類或它的子類的實例。import java.lang.*; //用實現(xiàn)Runnable接口的方式實現(xiàn)多線程。 public class Test{ public static void main(String arg[]){ T t1=new T(); T t2=new T(); //一定要實例化Thread對象,將實現(xiàn)Runnable接口的對象作為參數(shù)傳入。 Thread th1=new Thread(t1,"t1"); Thread th2=new Thread(t2,"t2"); //啟動線程 th1.start(); th2.start(); } } class T implements Runnable{ //重寫run()方法 public void run(){ System.out.println(Thread.currentThread().getName()); } }輸出結(jié)果為:t1t2public void run()方法是JAVA中線程的執(zhí)行體方法,所有線程的操作都是從run方法開始,有點類似于main()方法,即主線程。
package threadgroup;
class ThreadDemo3 extends Thread {
private String name;
private int delay;
public ThreadDemo3(String sname, int i_delay) {
name = sname;
delay = i_delay;
}
public void run() {
try {
sleep(delay);
} catch (InterruptedException e) {
}
System.out.println("多線程測試!\n" + name + "\n" + delay);
}
}
public class testMyThread {
public static void main(String[] args) {
ThreadDemo3 th1,th2,th3;
th1 = new ThreadDemo3("線程1", (int) (Math.random() * 900));
th2 = new ThreadDemo3("線程2", (int) (Math.random() * 900));
th3 = new ThreadDemo3("線程3", (int) (Math.random() * 900));
th1.start();
th2.start();
th3.start();
}
}
package threadgroup;
public class threadDemo {
public static void main(String[] args) {
Thread t = Thread.currentThread();
t.setName("你好嗎?");
System.out.println("正在進行的Thread是:" + t);
try {
for (int i = 0; i 5; i++) {
System.out.println("我不叫穆繼超" + i);
Thread.sleep(3000);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
}
}
package threadgroup;
public class threadDemo2 implements Runnable {
public threadDemo2() {
Thread t1 = Thread.currentThread();
t1.setName("第一個主進程");
System.out.println("正在運行" + t1);
Thread t2 = new Thread(this, "");
System.out.println("在創(chuàng)建一個進程");
t2.start();
try {
System.out.println("使他進入第一個睡眠狀態(tài)");
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第一個進程");
}
public void run() {
try {
for (int i = 0; i 5; i++) {
System.out.println("進程" + i);
Thread.sleep(3000);
}
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第二個進程");
}
public static void main(String[] args) {
new threadDemo2();
}
}
class MyJoinThread extends Thread
{
public MyJoinThread()
{
super();
}
public MyJoinThread(String name)
{
super(name);
}
public void run()
{
for(int i=0;i10;i++)
{
System.out.println(super.getName()+":"+i);
}
}
}
public class JoinTest
{
public static void main(String[] args)
{
MyJoinThread thread=new MyJoinThread("第1個線程");
thread.start();
for(int i=0;i10;i++)
{
System.out.println(Thread.currentThread().getName()+":"+i);
if(i==5)
{
try
{
thread.join();
}
catch (InterruptedException e)
{
System.out.println("線程被中斷");
}
}
}
}
}