程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程編程之應用thread類創立線程

java多線程編程之應用thread類創立線程

編輯:關於JAVA

java多線程編程之應用thread類創立線程。本站提示廣大學習愛好者:(java多線程編程之應用thread類創立線程)文章只能為提供參考,不一定能成為您想要的結果。以下是java多線程編程之應用thread類創立線程正文


在Java中創立線程有兩種辦法:應用Thread類和應用Runnable接口。在應用Runnable接口時須要樹立一個Thread實例。是以,不管是經由過程Thread類照樣Runnable接口樹立線程,都必需樹立Thread類或它的子類的實例。Thread類的結構辦法被重載了八次,結構辦法以下:


public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
Runnable target

完成了Runnable接口的類的實例。要留意的是Thread類也完成了Runnable接口,是以,從Thread類繼續的類的實例也能夠作為target傳入這個結構辦法。
String name
線程的名子。這個名子可以在樹立Thread實例後經由過程Thread類的setName辦法設置。假如不設置線程的名子,線程就應用默許的線程名:Thread-N,N是線程樹立的次序,是一個不反復的正整數。
ThreadGroup group
以後樹立的線程所屬的線程組。假如不指定線程組,一切的線程都被加到一個默許的線程組中。關於線程組的細節將在前面的章節具體評論辯論。
long stackSize
線程棧的年夜小,這個值普通是CPU頁面的整數倍。如x86的頁面年夜小是4KB。在x86平台下,默許的線程棧年夜小是12KB。
一個通俗的Java類只需從Thread類繼續,便可以成為一個線程類。並可經由過程Thread類的start辦法來履行線程代碼。固然Thread類的子類可以直接實例化,但在子類中必需要籠罩Thread類的run辦法能力真正運轉線程的代碼。上面的代碼給出了一個應用Thread類樹立線程的例子:

package mythread; 
public class Thread1 extends Thread
{
public void run()
{
System.out.println(this.getName());
}
public static void main(String[] args)
{
System.out.println(Thread.currentThread().getName());
Thread1 thread1 = new Thread1();
Thread1 thread2 = new Thread1 ();
thread1.start();
thread2.start();
}
}

下面的代碼樹立了兩個線程:thread1和thread2。上述代碼中的005至行是Thread1類的run辦法。當在014和015行挪用start辦法時,體系會主動挪用run辦法。在007行應用this.getName()輸入了以後線程的名字,因為在樹立線程時並未指定線程名,是以,所輸入的線程名是體系的默許值,也就是Thread-n的情勢。在011行輸入了主線程的線程名。
下面代碼的運轉成果以下:
main
Thread-0
Thread-1
從下面的輸入成果可以看出,第一行輸入的main是主線程的名子。前面的Thread-1和Thread-2分離是thread1和thread2的輸入成果。
留意:任何一個Java法式都必需有一個主線程。普通這個主線程的名子為main。只要在法式中樹立別的的線程,能力算是真實的多線程法式。也就是說,多線程法式必需具有一個以上的線程。
Thread類有一個重載結構辦法可以設置線程名。除應用結構辦法在樹立線程時設置線程名,還可使用Thread類的setName辦法修正線程名。要想經由過程Thread類的結構辦法來設置線程名,必需在Thread的子類中應用Thread類的public Thread(String name)結構辦法,是以,必需在Thread的子類中也添加一個用於傳入線程名的結構辦法。上面的代碼給出了一個設置線程名的例子:

package mythread;
public class Thread2 extends Thread
{
private String who;

public void run()
{
System.out.println(who + ":" + this.getName());
}
public Thread2(String who)
{
super();
this.who = who;
}
public Thread2(String who, String name)
{
super(name);
this.who = who;
}
public static void main(String[] args)
{
Thread2 thread1 = new Thread2 ("thread1", "MyThread1");
Thread2 thread2 = new Thread2 ("thread2");
Thread2 thread3 = new Thread2 ("thread3");
thread2.setName("MyThread2");
thread1.start();
thread2.start();
thread3.start();
}

在類中有兩個結構辦法:
第011行:public sample2_2(String who)
這個結構辦法有一個參數:who。這個參數用來標識以後樹立的線程。在這個結構辦法中依然挪用Thread的默許結構辦法public Thread( )。
第016行:public sample2_2(String who, String name)
這個結構辦法中的who和第一個結構辦法的who的寄義一樣,而name參數就是線程的名名。在這個結構辦法中挪用了Thread類的public Thread(String name)結構辦法,也就是第018行的super(name)。
在main辦法中樹立了三個線程:thread1、thread2和thread3。個中thread1經由過程結構辦法來設置線程名,thread2經由過程setName辦法來修正線程名,thread3未設置線程名。
運轉成果以下:

thread1:MyThread1
thread2:MyThread2
thread3:Thread-1

從下面的輸入成果可以看出,thread1和thread2的線程名都曾經修正了,而thread3的線程名依然為默許值:Thread-1。thread3的線程名之所以不是Thread-2,而是Thread-1,這是由於在026行曾經指定了thread2的Name,是以,啟動thread3時就將thread3的線程名設為Thread-1。是以就會獲得下面的輸入成果。
留意:在挪用start辦法前後都可使用setName設置線程名,但在挪用start辦法後應用setName修正線程名,會發生不肯定性,也就是說能夠在run辦法履行完後才會履行setName。假如在run辦法中要應用線程名,就會湧現固然挪用了setName辦法,但線程名卻未修正的景象。
Thread類的start辦法不克不及屢次挪用,如不克不及挪用兩次thread1.start()辦法。不然會拋出一個IllegalThreadStateException異常。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved