Ⅰ java中線程的幾種可用狀態有哪些請大家解釋一下。
我理解的有5種:
1、創建,剛創建出線程對象,比如new Thread()
2、就緒,調用了start方法,但內此時並不是調用就立馬被運行,容在這期間要讓cpu執行你,在等待執行過程叫就緒也叫等待。cpu並不是立馬執行,而是串列以極快速度切換進程的運行著
3、運行,正在運行了,創建出線程,脫離了主線程,進入run,天高任鳥飛
4、死亡,異常終止,或run執行完畢
5、阻塞,運行過程中,交出cpu執行權休眠。為什麼要休眠?某些某些特定的條件等待條件成熟,這時候手動讓線程休眠進入阻塞狀態
線程之間但狀態是可任意轉換的,阻塞醒來就是就緒,運行中又阻塞,就緒運行死亡,等狀態可切換。
還有一種是進程的狀態
1、就緒,創建子進程,等待cpu調度執行
2、運行,運行程序
3、僵屍,運行完畢死亡等待收屍
3、暫停,被信號暫停,等待信號喚醒
4、阻塞,等待條件成熟,人為休眠。條件滿足或喚醒
進程和線程狀態,非常類似
Ⅱ java 後台線程自己斷掉一般是什麼由原因引起的
1.所謂守護線程就是運行在程序後台的線程,程序的主線程Main(比方java程序回一開始啟動時創建的答那個線程)不會是守護線程.
2.Daemon thread在Java裡面的定義是,如果虛擬機中只有Daemon thread 在運行,則虛擬機退出。
虛擬機中可能會同時有很多個線程在運行,只有當所有的非守護線程都結束的時候,虛擬機的進程才會結束,不管在運行的線程是不是main()線程。
3.Main主線程結束了(Non-daemon thread),如果此時正在運行的其他threads是daemon threads,JVM會使得這個threads停止,JVM也停下.
如果此時正在運行的其他threads有Non-daemon threads,那麼必須等所有的Non daemon線程結束了,JVM才會停下來.
4.總之,必須等所有的Non-daemon線程都運行結束了,只剩下daemon的時候,JVM才會停下來,注意Main主程序是Non-daemon線程.
5.默認產生的線程全部是Non-daemon線程.
Ⅲ java多線程死循環
你程序是:
服務端有不斷的向客服端寫信息,客戶端有不斷的讀來自服務端的信息。
但是反過來,客戶端沒有不斷的向服務端寫信息。服務端也沒有不斷的讀來自客戶端的信息。
用線程解決:
在客戶端新加一條線程,專門用來讀取來自服務端的信息。
在服務端新加一條線程,專門用來讀取來自客戶端的信息。
而在各自的main()函數中只負責不斷接收system.in信息,然後發送信息..
其實不用線程的。。我也改了下,改的好像較多。
運行步驟:
開server端,開kehu端。客房端先寫入信息。。然後,你一句我一句。只能按這順序。。這就是沒用線程的結果。
代碼如下:
服務端:
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args)
{
System.out.println("我是伺服器");
try {
ServerSocket ss=new ServerSocket(8000);
Socket sk=ss.accept();
OutputStream os=sk.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
bw.write("你好,我是伺服器,有什麼需要我服務的嘛?\n");
bw.flush();
InputStream is=sk.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
while(true)
{
String str=br.readLine();
if(str.equals("bye")||str==null)break;
System.out.println("客戶端說:"+str);
String sr="";
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
sr=br1.readLine();
bw.write(sr+"\n");
bw.flush();
}
}
catch (Exception e) {
System.out.println("客用戶機己斷開");
}
}
}
客戶端:
import java.net.*;
import java.io.*;
public class kehu {
public static void main(String[] args)
{
System.out.println("我是客戶");
try {
Socket s=new Socket(InetAddress.getByName(null),8000);
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
OutputStream os=s.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
String sr="";
while(true)
{
sr=br.readLine();
if(sr.equals("bye")||sr==null)break;
System.out.println("伺服器說"+sr);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
sr=br1.readLine();
bw.write(sr+"\n");
bw.flush();
}
} catch (Exception e) {
System.out.println("伺服器未開戶或己關閉~");
}
}
}
Ⅳ java多線程死循環
如果你對一個線程 start 了,那你的程序中實際上有兩個線程,還有一個main
當前線回程是main的子線程,實際上運答行時,子線程start以後,main的方法還是會繼續往下執行,直到退出,當main退出以後,子線程也就死了,當你將死循環寫在子線程里,相當與子線程死掉了,但不影響主線程的執行,主線程遇到退出一樣退出了程序,當你寫在主線程里的死循環,那就在那裡循環,因為它沒有退出語句 System.exit(0); 或者執行到了最後一個大括弧
Ⅳ Java中一個線程執行死循環有什麼後果
總結:若線程A先獲得對象鎖時,由於while循環,線程A一直在while空循環中。而線程B也因為無法獲得鎖而執行不了methodB()。
可以看出,如果在一個線程在synchronized方法中無法退出,無法將鎖釋放,另一個線程就只能無限等待了。