线程的状态异常是什么原因啊?

wenyuanhao 2010-03-08 09:51:33
大家好!我在用郭克华的J2ME聊天系统中,客户端在连接网络时,出现这样的
提示,是什么问题呢?
Uncaught exception java/lang/IllegalThreadStateException.
以下是客户端的代码:
package chatsystem;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Vector;

import javax.microedition.io.Connector;
import javax.microedition.io.ServerSocketConnection;
import javax.microedition.io.SocketConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class ClientChatMidlet extends MIDlet implements CommandListener {

private SocketConnection sc;
private Form form;
private Display display;
private Command cmdSend;
private Command cmdLogin;
private TextField txtName;
private TextField txtMsg;
private DataOutputStream dos;
private DataInputStream dis;


public ClientChatMidlet() {
form = new Form("客户端聊天界面");
cmdSend = new Command("发送消息", Command.SCREEN, 1);
cmdLogin = new Command("登录到 服务器 ", Command.SCREEN, 1);
txtName = new TextField("昵称", "", 10, TextField.ANY);
txtMsg = new TextField("发送信息", "", 255, TextField.ANY);
form.addCommand(cmdLogin);
form.append(txtName);
//form.append(txtMsg);
form.setCommandListener(this);
}

protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(form);
try {
sc = (SocketConnection) Connector
.open("socket://localhost:999");

System.out.println(sc.getAddress());//显示:127.0.0.1
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
//new ChatThread().start();
// System.out.println("new ChatThread().start()没问题吧");
} catch (IOException e) {
e.printStackTrace();
}

}

public void commandAction(Command c, Displayable d) {
if (c == cmdSend) {
try {

dos.writeUTF(txtMsg.getString());


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (c == cmdLogin) {
try {
form.removeCommand(cmdLogin);
form.addCommand(cmdSend);

dos.writeUTF(txtName.getString());
// 登录成功,显示发送的信息
form.append(txtMsg);
new ChatThread().start();


// dis = sc.openDataInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

class ChatThread extends Thread {

public ChatThread() {

}

public void run() {
while (true) {

try {
sc = (SocketConnection) Connector
.open("socket://localhost:999");
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
dos.writeUTF(txtName.getString());
//运行到这里出错了,下面就不执行了。可能是这里的问题,但不知道如何修改
this.start();


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
}
}
...全文
132 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
abibi2011 2011-06-21
  • 打赏
  • 举报
回复
请问楼主最后如何解决的,我仍然有这个问题!!!
wenyuanhao 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sodino 的回复:]
dos.writeUTF(txtName.getString());
// 登录成功,显示发送的信息
form.append(txtMsg);
new ChatThread().start(); //这儿已经start()一次了



this.start(); //这儿又被Start()了,

你看下api,抛出异常的原因是:

Throws:
IllegalThread……
[/Quote]

是的,还有个地方是死循环,现在解决了。谢谢
Sodino 2010-03-11
  • 打赏
  • 举报
回复

dos.writeUTF(txtName.getString());
// 登录成功,显示发送的信息
form.append(txtMsg);
new ChatThread().start(); //这儿已经start()一次了



this.start(); //这儿又被Start()了,

你看下api,抛出异常的原因是:

Throws:
IllegalThreadStateException - if the thread was already started.
wenyuanhao 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhouyongyang621 的回复:]
首先建议你对这种网络操作最好另起一个线程,不要在MIDLET中去进行连接操作,可能会线程阻塞。。。

你的线程.start()怎么能写在你的run()方法中了这是很不好的写法而且肯定报错,,,
你可以写在你的构造函数中public ChatThread() {

}


[/Quote]

请教下如何更正啊,找了好几天,还是没有头绪。
梦_枫 2010-03-09
  • 打赏
  • 举报
回复
首先建议你对这种网络操作最好另起一个线程,不要在MIDLET中去进行连接操作,可能会线程阻塞。。。

你的线程.start()怎么能写在你的run()方法中了这是很不好的写法而且肯定报错,,,
你可以写在你的构造函数中public ChatThread() {

}

凡员外 2010-03-09
  • 打赏
  • 举报
回复
引用楼主 zhsifu 的回复:
大家好!我在用郭克华的J2ME聊天系统中,客户端在连接网络时,出现这样的
提示,是什么问题呢?
Uncaught exception java/lang/IllegalThreadStateException.
以下是客户端的代码:
package chatsystem;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Vector;

import javax.microedition.io.Connector;
import javax.microedition.io.ServerSocketConnection;
import javax.microedition.io.SocketConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class ClientChatMidlet extends MIDlet implements CommandListener {

private SocketConnection sc;
private Form form;
private Display display;
private Command cmdSend;
private Command cmdLogin;
private TextField txtName;
private TextField txtMsg;
private DataOutputStream dos;
private DataInputStream dis;


public ClientChatMidlet() {
form = new Form("客户端聊天界面");
cmdSend = new Command("发送消息", Command.SCREEN, 1);
cmdLogin = new Command("登录到 服务器 ", Command.SCREEN, 1);
txtName = new TextField("昵称", "", 10, TextField.ANY);
txtMsg = new TextField("发送信息", "", 255, TextField.ANY);
form.addCommand(cmdLogin);
form.append(txtName);
//form.append(txtMsg);
form.setCommandListener(this);
}

protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
display.setCurrent(form);
try {
sc = (SocketConnection) Connector
.open("socket://localhost:999");

System.out.println(sc.getAddress());//显示:127.0.0.1
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
//new ChatThread().start();
// System.out.println("new ChatThread().start()没问题吧");
} catch (IOException e) {
e.printStackTrace();
}

}                 

public void commandAction(Command c, Displayable d) {
if (c == cmdSend) {
try {

dos.writeUTF(txtMsg.getString());


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (c == cmdLogin) {
try {
form.removeCommand(cmdLogin);
form.addCommand(cmdSend);

dos.writeUTF(txtName.getString());
// 登录成功,显示发送的信息
form.append(txtMsg);
new ChatThread().start();


// dis = sc.openDataInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

class ChatThread extends Thread {

public ChatThread() {

}

public void run() {
while (true) {

try {
sc = (SocketConnection) Connector
.open("socket://localhost:999");
dis = sc.openDataInputStream();
dos = sc.openDataOutputStream();
dos.writeUTF(txtName.getString());
                                              //运行到这里出错了,下面就不执行了。可能是这里的问题,但不知道如何修改
this.start();


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
}
}
不懂帮顶!
zp110579 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 zhouyongyang621 的回复:
首先建议你对这种网络操作最好另起一个线程,不要在MIDLET中去进行连接操作,可能会线程阻塞。。。

你的线程.start()怎么能写在你的run()方法中了这是很不好的写法而且肯定报错,,,
你可以写在你的构造函数中public ChatThread() {

}


这是在 网上郭克华的视频里的发方法,写在构造方法里也不行,试过了。
wenyuanhao 2010-03-09
  • 打赏
  • 举报
回复
写到构造方法里我也试过,也不行的啊。
不停的跳出:java.io.IOException: no more input streams available
感觉不难,但怎么调试都不行,我经过测试,感觉是 this.start()的 问题,但是取消,控制台会出现:java.io.IOException: error 10054 during TCP read
太郁闷了!

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧