因为代码量太多,一下贴不上来。情况是这样的,我大概描述一下。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);
但是解决不了
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);
但是解决不了
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;
}
}
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;
}
}
我说的就是计算的那个,你计算用单例,多线程,和单例单线程有什么区别吗?多线程,其他线程得等到计算完了才能再计算,但是计算完了,刚才那个计算线程也就空闲了,可以再继续用不是吗?我总觉得我没有把意思表述清楚。
我在Android上跑程序,如果长时间的运算,一定会造成界面无响应。所以我想到了另开一条线程专门做运算,但因为是要对全局的操作进行监听,根据变化的结果进行运算,所以这个线程只能是单例,保持唯一,这样有什么不对吗?
问题是这样会有延迟的。因为对用户的响应几乎达到了实施的,线程间通信会不会影响?
能否给个链接或者是样例代码,大致思路也可,本人初学,不胜感激。
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("开始执行关闭的方法"); }
}