java中线程的状态获取
工作中需要获取java线程的状态。该线程与服务器进行通讯,阻塞读网络数据,当没有数据到达时,线程的状态应该是阻塞的,但是Thread.getState()返回是RUNNABLE的?因此,我就无法判断线程是否是阻塞的,请问这是为什么?是不是除Thread.getState()外还有别的获取线程状态的函数。
我做了一个示例程序
myserver.java 服务进程,接收客户发送的内容并将用户在控制台的输入信息发送给客户程序。
myclient.java客户进程,包含一个主线程和一个通讯线程(ClientThread.java)。
通讯线程将用户在控制台的输入信息发送给服务线程,并接收服务线程发送的信息(阻塞读)。
主线程创建通讯线程,并定期打印通讯线程的状态。
程序运行后,主线程打印的通讯线程的状态一直是RUNNABLE,而不管通讯线程是否正在阻塞读。因此,我就无法判断线程是否是阻塞的,请问这是为什么?是不是除Thread.getState()外还有别的获取线程状态的函数。
多谢!!!!
myserver.java服务进程
------------------------------------------------------------------------------------------
import java.net.*;
import java.io.*;
public class myserver
{
@SuppressWarnings("deprecation")
public static void main(String args[])
{
ServerSocket server;
Socket socket;
String s;
InputStream Is;
OutputStream Os;
DataInputStream DIS;
PrintStream PS;
try
{
//在端口4321注册服务
server=new ServerSocket(9999);
socket=server.accept();
//监听窗口,等待连接
System.out.println("server ok");
System.out.println("************************************************");
System.out.println("");
//获得对应Socket的输入/输出流
Is=socket.getInputStream();
Os=socket.getOutputStream();
//建立数据流
DIS=new DataInputStream(Is);
PS=new PrintStream(Os);
DataInputStream in=new DataInputStream(System.in);
while(true)
{
System.out.println("");
System.out.println("please wait client's message...");
System.out.println("");
s=DIS.readLine(); //读入从client传来的字符串
System.out.println("client said:"+s); //打印字符串
if(s.trim().equals("BYE"))
break; //如果是"BYE",就退出
System.out.print("you say:");
s=in.readLine(); //读取用户输入的字符串
PS.println(s); //将读取得字符串传给client
if(s.trim().equals("BYE"))
break; //如果是"BYE",就退出
}
//关闭连接
DIS.close(); //关闭数据输入流
PS.close(); //关闭数据输出流
Is.close(); //关闭输入流
Os.close(); //关闭输出流
socket.close(); //关闭sockey
}
catch(Exception e)
{
System.out.println("Error:"+e);
}
}
}
myclient.java客户进程
------------------------------------------------------------------------------------------
import java.net.*;
import java.io.*;
import java.lang.*;
public class myclient
{
public static void main(String args[]) throws InterruptedException
{
ClientThread ct = new ClientThread ();
Thread clientthread = new Thread(ct);
clientthread.start();
for(;;)
{
System.out.println(clientthread.getState());
Thread.sleep(2000);
}
}
}
ClientThread.java
------------------------------------------------------------------------------------------
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class ClientThread implements Runnable
{
public void run()
{
Socket socket;
String s="yxfsoft@263.net";
String len;
InputStream Is;
OutputStream Os;
DataInputStream DIS;
PrintStream PS;
try
{
//向主机名为args[0]的服务器申请连接
//注意端口号要与服务器保持一致:4321
socket=new Socket("127.0.0.1",9999);
System.out.println("client ok");
System.out.println("************************************************");
System.out.println("");
//获得对应socket的输入/输出流
Is=socket.getInputStream();
Os=socket.getOutputStream();
//建立数据流
DIS=new DataInputStream(Is);
PS=new PrintStream(Os);
DataInputStream in=new DataInputStream(System.in);
while(true)
{
System.out.print("you say:");
s=in.readLine(); //读取用户输入的字符串
PS.println(s); //将读取得字符串传给server
if(s.trim().equals("BYE"))break; //如果是"BYE",就退出
else
{
System.out.println("");
System.out.println("please wait server's message...");
System.out.println("");
}
s=DIS.readLine(); //从服务器获得字符串
System.out.println("server said:"+s); //打印字符串
if(s.trim().equals("BYE"))break; //如果是"BYE",就退出
}
//关闭连接
DIS.close(); //关闭数据输入流
PS.close(); //关闭数据输出流
Is.close(); //关闭输入流
Os.close(); //关闭输出流
socket.close(); //关闭socket
}
catch(Exception e)
{
System.out.println("Error:"+e);
}
}
}