因为代码量太多,一下贴不上来。情况是这样的,我大概描述一下。class Compare{
private Element ea;
private Element eb;    
    public static add(Element e){
    {....进行一些操作}
    compare(ea,eb);//这个包含了大量的运算
}
}class Action extends Element{
   public void do(){
       Compare.add(this);
   }
}Action ea = new Action();
Action eb = new Action();
ea.do();
eb.do();调用do()方法的时候会占用大量的CPU资源,导致界面无响应。我想的是新开一个线程,专门放置Compare.add(this);
但是解决不了

解决方案 »

  1.   

    有高手指导下吗?class static main(String[] arg0){
        Action action = new Action();
        Thread thread = new Thread(action);
        thread.start;
        
        for(int i = 0;i<10;i++){
        action.do(); 
        }
        ……
    }class Action extends Element implements Runnable{
       
       private boolean doBoolean =false;
       public void run(){
        while(true){
        while(doBoolean){
    compare(sth);doBoolean= false; }
        }  
        }
       public void synchronized do(){
           add(this);
           doBoolean= true;
       }
    }
      

  2.   

    这个代码有什么问题?class static main(String[] arg0){
        Action action = new Action();
        Thread thread = new Thread(action);
        thread.start;
        
        for(int i = 0;i<10;i++){
        action.do(); 
        }
        ……
    }class Action extends Element implements Runnable{
       
       private boolean doBoolean =false;
       public void run(){
        while(true){
        while(doBoolean){
            synchronized(Action.class){compare(sth);doBoolean= false; }
        }
        }  
        }
       public void synchronized do(){
           add(this);
           doBoolean= true;
       }
    }
      

  3.   

    客户端的设计,肯定是不能把耗时计算放在主线程里的,你这个action.do()不是还在主线程里么?多线程,异步计算可以解决你的问题
      

  4.   

    多线程你设计一个单例模式,那还要多线程有什么意义啊?其他线程都得等methodA()计算完了才能继续计算,这和单线程有什么区别!
      

  5.   

    代码问题太多了,不知道从何说起了,就先说一个问题线程启动后你的 while(true){}是一直在跑的,不断的在进行判断操作while(doBoolean){}这样你开几个线程电脑就卡死了,楼主还是先百度一下多线程编程的例子吧
      

  6.   

    我深表不解啊main里面new 的线程,怎么会是在主线程里面?
      

  7.   

    单例是放在另一个线程里面,做运算,还有一个线程是响应UI界面。
    我说的就是计算的那个,你计算用单例,多线程,和单例单线程有什么区别吗?多线程,其他线程得等到计算完了才能再计算,但是计算完了,刚才那个计算线程也就空闲了,可以再继续用不是吗?我总觉得我没有把意思表述清楚。
    我在Android上跑程序,如果长时间的运算,一定会造成界面无响应。所以我想到了另开一条线程专门做运算,但因为是要对全局的操作进行监听,根据变化的结果进行运算,所以这个线程只能是单例,保持唯一,这样有什么不对吗?
      

  8.   

    你是在android上跑啊?那你怎么跑j2ee来了 android上的话你肯定不能将太耗cpu的计算放在主线程中,在.net中允许crossthread的情况出现,也就是界面的更新可以在另外的线程中去干,但android不允许这种情况。在android中你可以将占cpu的计算在另外一个线程中执行,然后通过线程间的通信让主线程去做更新,当然你也可以使用service做计算,然后通过broadcast的方式去通知等。
      

  9.   

    我觉得J2EE这里应该都是技术比较高的,对于线程这种东西,可能这地方的人水平更高,能够给我解答。通过线程间的通信?
    问题是这样会有延迟的。因为对用户的响应几乎达到了实施的,线程间通信会不会影响?
    能否给个链接或者是样例代码,大致思路也可,本人初学,不胜感激。
      

  10.   

    package com.example.socketdemo;import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.app.Activity;
    import android.content.Intent;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {
    private static final String TAG = "MainActivity";
    // 定义侦听端口号
    private final int SERVER_PORT = 7100;
    private TextView textView;
    private String content = "客户端输入的值:";
    private Button btn, disbtn;
    ServerSocket serverSocket;
    Socket socket;
    Thread bb,aa;
    @Override

    //activity创建的时候给各变量赋值
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainSocket);
    btn = (Button) findViewById(R.id.btnconnect);// 连接服务器的按钮
    btn.setOnClickListener(this);
    textView = (TextView) findViewById(R.id.tv);
    disbtn = (Button) findViewById(R.id.btndisconnect);
    disbtn.setOnClickListener(this); } //你可以将计算的函数换到这里来
    private void startServer() {
    try {
    // ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
     serverSocket = new ServerSocket(SERVER_PORT);
    // 循环侦听客户端连接请求
    while (true) {  socket = serverSocket.accept();
    try {
    Log.e(TAG, "有人来访:");
    // 等待客户端发送打开网站的消息
    BufferedReader in = new BufferedReader(
    new InputStreamReader(socket.getInputStream()));
    String str = in.readLine();
    content += str + "\n";
    DataOutputStream dos = new DataOutputStream(
    socket.getOutputStream());
    dos.writeUTF("hello,client");

    //计算完以后通过这个向主线程发消息 也就是线程间的通信
    Message msg = mHandler.obtainMessage();
    msg.obj = content; mHandler.sendMessage(msg); } catch (Exception e) {
    e.printStackTrace();
    } finally {
    socket.close();
    }
    Thread.sleep(3000);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    //这是主线程的handler,处理你给主线程发来的消息
    public Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    textView.setText(msg.obj.toString());

    } }; //按钮的onclick事件
    @Override
    public void onClick(View v) {
    if (v == btn) {
    // 开一个新的线程来侦听客户端连接及发来的信息和打开相应网站
     aa = new Thread() {
    public void run() {
    startServer();
    }
    };
    aa.start();
    System.out.println("线程开启");
    }
    else if(v==disbtn)
    {
    System.out.println("点击了关闭按钮");
     bb = new Thread() {
    public void run() {
    stopServer();
    }
    };
    bb.start();
    System.out.println("线程关闭");
    } }
    private void stopServer() {
    System.out.println("开始执行关闭的方法"); }
    }
      

  11.   

    给你贴了个代码 大概写了点注释,你将你的代码换进去就可以了 对于android来说 你可以到android专区去 这个问题很快就有高手帮你解决了 顺便说一句就是在android中大计算必须通过新的线程来算 而且线程间得有通信将结果传给主线程去更新 这些和windows上的消息驱动都很像 本人主要还是j2ee ,android么不是强项 要是解决不了你还是到android专区去
      

  12.   

    小白兔也是做java的啊。我以为你就只会灌水那
      

  13.   

    小白兔也是做java的啊。我以为你就只会灌水那人家有认真工作啊!我不仅仅是灌水啊冤枉我!
      

  14.   

    小白兔也是做java的啊。我以为你就只会灌水那人家有认真工作啊!我不仅仅是灌水啊冤枉我!技术分太少