java线程与应用程序共用数组问题

achillesvi 2015-07-21 06:30:28
java线程循环不停扫描数组数据,线程启动后,通过应用程序别的方法向这个数组中加数据后,线程中仍读不到应用程序添加进来的数组数据。

不知其他大侠有没有遇到过这种问题。
...全文
209 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
achillesvi 2015-07-23
  • 打赏
  • 举报
回复
参考楼上的,终于解决了 import java.util.ArrayList; import java.util.List; public class DemoTest { private static List<String> list = new ArrayList<String>(); private static void setup() { new Thread() { @Override public void run() { super.run(); while(true) { if (list.size() > 0) { System.out.println("Out:-------------------------------------- "); synchronized (list) { for (int i = list.size() - 1; i >= 0; i-- ) { System.out.println(i+":"+list.get(i) + " "); list.remove(i); } System.out.println(" -------------------------------------- end"); } } else { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }.start(); } public static void writeNewData(String s) { synchronized (list) { list.add(s); } } static { DemoTest.setup(); } } 别的类中再调用DemoTest.sendDataCmd(strInput);就可以成功将数据写入list中了。
晴天_ccc 2015-07-22
  • 打赏
  • 举报
回复
public class Demo {
	public static void main(String[] args) {
		final Res resource = new Res();

		new Thread(new Runnable() {
			private boolean isRunning = true;

			@Override
			public void run() {
				// while (isRunning) {
				// resource.get();
				// }

				for (int i = 0; i < 1000; i++) {
					System.out.println("扫描到当前元素:" + resource.get());
				}

			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 0; i < 1000; i++) {
					resource.put(i);
					System.out.println("成功添加 :" + i);
				}
			}
		}).start();

	}
}

class Res {
	private List<Integer> array = new ArrayList<Integer>();
	private ListIterator<Integer> iterator = array.listIterator();

	Res() {
		iterator.add(50);
		iterator.add(60);
		iterator.add(70);
	}

	public synchronized void put(Integer data) {
		iterator.add(data);
	}

	public synchronized Integer get() {
		if (iterator.hasNext()) {
			Integer data = iterator.next();
			return data;
		}

		else {// 迭代到结尾或者集合已空
				// 集合空
			if (array.isEmpty())
				return null;
			// 集合非空
			iterator = array.listIterator();
			Integer data = iterator.next();
			return data;
		}
	}
看看这代码能不能满足你的需求。。。。
酷酷啦啦xsx 2015-07-22
  • 打赏
  • 举报
回复
顶楼上,推荐用队列
peter_xizi 2015-07-22
  • 打赏
  • 举报
回复
多线程共享数据时必须确保可见性和安全性,关键字Volatile可保证可见性,但不保证安全性 你用的ArrayList既没有保证可见性,也没有保证安全性,可以用线程安全的容器,有同步容器如Vector, Hashtable,并发容器CopyOnWriteArrayList等等 现代JVM有许多优化功能,为了提高性能,有些数据在操作过程中数据会缓存在寄存器中,对其他线程是不可见的, 有些操作由于JVM的重排序,也会导致不可见 线程安全的内容很多,不是一两句说得清的
achillesvi 2015-07-21
  • 打赏
  • 举报
回复
public class TestThread extends Thread { public ArrayList<DataCmdItem> commandArray = new ArrayList<DataCmdItem>(); public boolean isCircle = true; private Socket socket; public TCP() {} public void connect() { } public void sendDataCmd( byte[] cmd) { DataCmdItem item = new DataCmdItem(); item.cmd = cmd; commandArray.add(item); } private int count = 0;// 扫描的次数 @Override public void run() { super.run(); while (true) { if (isCircle) { connect(); count++; if (socket != null && socket.isConnected()&&!socket.isClosed()) { if (commandArray.size() > 0) { try { out = socket.getOutputStream(); DataCmdItem item = commandArray.get(0); // 每次获取第一条指令 byte[] outByte = item.cmd; out.write(outByte); out.flush(); System.out.println("tcp 发送的数据 " + new String(outByte)); commandArray.remove(0); // 执行完后,删除 } catch (IOException e) {e.printStackTrace();} } } } } } } 上面是线程概要代码,下面是调用sendDataCmd向数组commandArray中加数据的。 public static void main(String[] args) { String strInput2 = "1234567890"; byte[] byBuffer2 = strInput2.getBytes(); for (int a = 0; a < 3; a++) { sendDataCmd(byBuffer2); } }
飏飏一蝶 2015-07-21
  • 打赏
  • 举报
回复
代码问题啊,你这么说好抽象的。

50,710

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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