首页 > 代码库 > 线程同步问题

线程同步问题

============问题描述============


我想让下面的mythread中的循环执行完毕之后再在主线程里给messageList设置Adapter。
Thread myThread = new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					Map<String, String> map1 = new HashMap<String, String>();
					map1.put("", "");
					String retStr = "";
					retStr = NetTool.sendGetRequest(messageShowUrl, map1,
							"utf-8");
					String[] str = retStr.split(",");
					list = Arrays.asList(str);
					listAll.clear();
					for (int i = 0; i < str.length / 5; i++) {
						Map<String, Object> map2 = new HashMap<String, Object>();
						map2.put("user_name", list.get(i * 5));
						map2.put("object_words", list.get(i * 5 + 1));
						map2.put("my_words", list.get(i * 5 + 2));
						map2.put("date", list.get(i * 5 + 4));

						// 如果用户没有传照片,map2中传的imageUrl就为空
						System.out.println("list3 = " + list.get(i * 5 + 3));
						if (!list.get(i * 5 + 3).equals(" ")) {
							String imageUrl1 = "http://10.0.2.2:8080/BBStuServlet/"
									+ list.get(i * 5 + 3);
							String imageUrl = imageUrl1.replace(" ", "");
							map2.put("imageUrl", imageUrl);
						} else {
							map2.put("imageUrl", "");
						}
						listAll.add(map2);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		myThread.start();
		MyAdapter adapter = new MyAdapter(this);
		messageList.setAdapter(adapter);


于是我改成了下面的形式:
Thread myThread = new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					Map<String, String> map1 = new HashMap<String, String>();
					map1.put("", "");
					String retStr = "";
					retStr = NetTool.sendGetRequest(messageShowUrl, map1,
							"utf-8");
					String[] str = retStr.split(",");
					list = Arrays.asList(str);
					listAll.clear();
					synchronized (this) {

						for (int i = 0; i < str.length / 5; i++) {
							Map<String, Object> map2 = new HashMap<String, Object>();
							map2.put("user_name", list.get(i * 5));
							map2.put("object_words", list.get(i * 5 + 1));
							map2.put("my_words", list.get(i * 5 + 2));
							map2.put("date", list.get(i * 5 + 4));

							// 如果用户没有传照片,map2中传的imageUrl就为空
							System.out.println("list3 = " + list.get(i * 5 + 3));
							if (!list.get(i * 5 + 3).equals(" ")) {
								String imageUrl1 = "http://10.0.2.2:8080/BBStuServlet/"
										+ list.get(i * 5 + 3);
								String imageUrl = imageUrl1.replace(" ", "");
								map2.put("imageUrl", imageUrl);
							} else {
								map2.put("imageUrl", "");
							}
							listAll.add(map2);
						}
						notifyAll();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		myThread.start();

		synchronized (myThread) {
			try {
				myThread.wait();
				MyAdapter adapter = new MyAdapter(this);
				messageList.setAdapter(adapter);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}



但是运行的时候直接就黑屏没有响应了,请问这是怎么回事?到底是哪里不对

============解决方案1============


你这里 myThread.wait();了,是在主线程里wait了啊,在等着线程里的notifyAll呢,当然会黑掉
你应该用handler来发消息

============解决方案2============


楼主,1楼的说法是正确的,这里我把你的代码整理了下  ,红色字体为关键处
package app.example.testapp;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {
Thread myThread = new Thread(new Runnable() {
 
        @Override
        public void run() {
            try {
                Map<String, String> map1 = new HashMap<String, String>();
                map1.put("", "");
                String retStr = "";
                retStr = NetTool.sendGetRequest(messageShowUrl, map1,
                        "utf-8");
                String[] str = retStr.split(",");
                list = Arrays.asList(str);
                listAll.clear();
                for (int i = 0; i < str.length / 5; i++) {
                    Map<String, Object> map2 = new HashMap<String, Object>();
                    map2.put("user_name", list.get(i * 5));
                    map2.put("object_words", list.get(i * 5 + 1));
                    map2.put("my_words", list.get(i * 5 + 2));
                    map2.put("date", list.get(i * 5 + 4));

                    // 如果用户没有传照片,map2中传的imageUrl就为空
                    System.out.println("list3 = " + list.get(i * 5 + 3));
                    if (!list.get(i * 5 + 3).equals(" ")) {
                        String imageUrl1 = "http://10.0.2.2:8080/BBStuServlet/"
                                + list.get(i * 5 + 3);
                        String imageUrl = imageUrl1.replace(" ", "");
                        map2.put("imageUrl", imageUrl);
                    } else {
                        map2.put("imageUrl", "");
                    }
                    listAll.add(map2);
                }
                handler.sendEmptyMessage(0);//给Handler发送消息
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });


Handler handler = new Handler() {

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==0) {//接收到对应的消息进行处理
MyAdapter adapter = new MyAdapter(this);
messageList.setAdapter(adapter);
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myThread.start();// 开启线程

}

}

线程同步问题