站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题大家好 我是新人 请教一个线程调用问题

大家好 我是新人 请教一个线程调用问题

摘要: 大家好 我是新人 请教一个线程调用问题


我做个网关的程序要进行测试,
程序主类是public class GWMain{
.........
}
测试程序public class ClientTest {
.................
public class Worker extends Thread{
......}(线程)
}
要启动线程的话是不是要在主类中启动服务器的同时启动线程?
应该怎样在程序主类中调用测试程序中的线程类?(我在GWMain中newy了一个Worker的实例,结果显示错误不能调用)
这个问题捆了我好久了 大家帮帮忙 谢谢了!


做程序这么久,都没有怎么用线程的哦


我刚学socket做东西就涉及到线程了,我也没用过就看了一些资料实际应用起来有很多问题


具体你怎么写的贴出来才能知道错误在哪


这是2部分程序主要部分代码,我想实现的功能就是主类调用测试类的线程,发送指令给网关服务器测试是能返回结果,很多部分是照相关例子写的,如果有错误请指点,谢谢!
主类:
public class GWMain {
public static boolean isRunning= false;
public static Loggerlog= null;
private Serversgw= null; //侦听网关连接的服务
private static int userid = 0;
public static void main(String[] args){
GWMain gwm = new GWMain();

if(!gwm.init()){
System.out.println("initliaze gateway server error!");
return;
}
if(!gwm.startup()){
log.warning("start up gate server error!");
return;
}
}

//初始化服务器
public boolean init(){

try{
ServerPro.getProperties();
Logginglogg = new Logging(this.getClass().getName());
logg.addFileHandler("log/gateway", 10000000, 1);
log = logg.Logger();
}catch(Exception e){
e.printStackTrace();
isRunning = false;
}
isRunning = true;
return true;
}
//起动服务
public boolean startup(){
try{
//启动socket服务
if(ServerPro.gwport>0){
sgw = new Server("sgw", ServerPro.gwport, new GWHandler());
// GWHandler类是处理指令解析的,如果连接网关成功则调用之。
log.info("listen:"+ServerPro.gwport);}catch(Exception e){
e.printStackTrace();
try{
sgw.close();
}catch(Exception ex){
}
Server.stopAll();
DatagramService.stopAll();
isRunning = false;
return false;
}
log.info("server start!");
return true;
}

测试类:
public class ClientTest {

private static Logger log = GWMain.log;
private static IoSession clios = null;
private static Client client = null;
private Worker worker = new Worker();
private DataPack dp = new DataPack();

private ClientTest(){
worker.start();
}
public void setIoSession(IoSession ios){
clios = ios;
}
public IoSession getIoSession(){
return clios;
}

//连接网关服务器
public void connect(){
if(clios != null) return ;
try{
client = new Client(new GWHandler());
GWSession gwss = new GWSession();
clios = client.Connect(ServerPro.gwip,ServerPro.gwport, gwss);
if(clios != null){
gwss.setIoSession(clios);
log.info("Connecting gateway server successful!");
send_D1(clios);
}
}catch(Exception e){
clios = null;
log.warning(e.getMessage());
}
}
//用户登陆
public void send_D1(IoSession ios){
............
}
//指令转发
public void send_D5(IoSession ios){
............
}

public class Worker extends Thread{
public void run(){
while(GWMain.isRunning){
connect();
try{
sleep(100);
}catch(Exception e){
log.warning(e.getMessage());
}
send_D5();
}
if(client != null){
try{
client.close();
}catch(IOException e){
log.warning(e.getMessage());
}
}
}
}


你的GWMain 里面好象并没有new一个ClientTest 的实例啊
另外你的错误发生情况没有表述清楚,或者是偶理解能力有限。。。。。。


new ClientTest实例 如何调用线程啊,我就是要在GWMain里调用线程Worker类,实现connect和send_D5方法,我的程序也不一定都是对的,我只是想知道如何实现线程类Worker。


偶糊涂了。。。。。。

private ClientTest(){
worker.start();
}------------------------------调用

Worker类已经实现了嘛,看下面:

public class Worker extends Thread{
public void run(){
while(GWMain.isRunning){
connect();
try{
sleep(100);
}catch(Exception e){
log.warning(e.getMessage());
}
send_D5();
}
if(client != null){
try{
client.close();
}catch(IOException e){
log.warning(e.getMessage());
}
}
}
}



这里是实现了,但是它属于ClientTest类中的,程序运行要从主类GWMain()开始,直接运行的话就是服务器启动而已,要实现其他类就要在程序主类中调用它们;要启动线程,是不是要在启动socket服务器的同时启动线程?就是在下面这个部分调用线程类?
//起动服务
public boolean startup(){
try{
//启动socket服务
if(ServerPro.gwport>0){
sgw = new Server("sgw", ServerPro.gwport, new GWHandler());
// GWHandler类是处理指令解析的,如果连接网关成功则调用之。
log.info("listen:"+ServerPro.gwport);}catch(Exception e){
e.printStackTrace();
try{
sgw.close();
}catch(Exception ex){
}

这里是参考例子写的,我也不是特别清楚,如果它的作用是调用start方法启动线程,那么如何在程序主类中实现呢?
private ClientTest(){
worker.start();
}------------------------------调用





Worker worker = new Worker();
worker.start();

其实你的程序在主类程序中调用ClientTest就调用了worker线程实例了啊


我在主类程序中试过new Worker的实例:Worker worker = new Worker();但是显示错误,是由于它是ClientTest的子类不能在其他类中直接定义实例吧?如果在主类调用ClientTest的话应该怎样处理是new一个实例吗?我试过,但是然后用它的实例怎么做?它不能调用Worker呀?我的语法基础不怎么好,请指点,谢谢!


你在什么位置定义new的?worker是个单独类,应该在任何想应用得地方使用,
如果要通过ClientTest实例调用,就这样,ClientTest.worker ,但private要更改成public


//启动socket服务
if(ServerPro.gwport>0){
sgw = new Server("sgw", ServerPro.gwport, new GWHandler());
log.info("listen:"+ServerPro.gwport);
ClientTest.Worker;
}

我在这里调用Worker报错:
语法错误,将“AssignmentOperator ArrayInitializer”插入到完整 Expression 中
是怎么回事?

我在全局变量中定义Worker的实例显示这样的错误:
没有任何类型 ClientTest 的外层实例可访问。必须用类型 ClientTest 的外层
实例(例如,x.new A(),其中 x 是 ClientTest 的实例)来限定分配。
我定义 ClientTest实例,也没有x. new A()这样的方法呀


↑返回目录
前一篇: 新人关于线程处理的问题 请大侠们指点~
后一篇: MyEclipse5.0开发struts的问题