传入Thread的都是ArrayList除了最后一个s是String
在每个Thread进行处理时都需要s来进行判断而且都会在s里附加文本
我的想法是用以下的方法是不是可行
但有一个问题是传入时s是""会不会同样二个进程同时抓到""那就会有问题
该如何避免这种问题?
- Java code
String s="";LoopThread lt01=new LoopThread(al1,al2,al3,al4,al5,al6,al7,al8,al9,al10,bomal2,al11,s ); lt01.start(); LoopThread lt02=new LoopThread(al2,al3,al4,al5,al6,al7,al8,al9,al10,al1,bomal2,al11,s ); lt02.start(); LoopThread lt03=new LoopThread(al3,al4,al5,al6,al7,al8,al9,al10,al1,al2,bomal2,al11,s ); lt03.start(); LoopThread lt04=new LoopThread(al4,al5,al6,al7,al8,al9,al10,al1,al2,al3,bomal2,al11,s ); lt04.start(); LoopThread lt05=new LoopThread(al5,al6,al7,al8,al9,al10,al1,al2,al3,al4,bomal2,al11,s ); lt05.start(); LoopThread lt06=new LoopThread(al6,al7,al8,al9,al10,al1,al2,al3,al4,al5,bomal2,al11,s ); lt06.start(); LoopThread lt07=new LoopThread(al7,al8,al9,al10,al1,al2,al3,al4,al5,al6,bomal2,al11,s ); lt07.start(); LoopThread lt08=new LoopThread(al8,al9,al10,al1,al2,al3,al4,al5,al6,al7,bomal2,al11,s ); lt08.start(); LoopThread lt09=new LoopThread(al9,al10,al1,al2,al3,al4,al5,al6,al7,al8,bomal2,al11,s ); lt09.start(); LoopThread lt10=new LoopThread(al10,al1,al2,al3,al4,al5,al6,al7,al8,al9,bomal2,al11,s ); lt10.start();
------解决方案--------------------
没看懂你想干啥,但你应该知道:“String对象是不可修改的”。
从代码肤浅的来看,对于 String s 来说,有两种结果:
1、你想干的事情绝对不可能实现;
2、你想干的事情绝对没有并发问题。
------解决方案--------------------
java.lang.String类中,没有变更里面字符的方法,所以,String是当做常量使用的。
所以,线程里面对String的操作,按楼主的写法,貌似传不出来。
如果楼主要共享String的内容,可以写成线程的静态变量;或者,使用StringBuffer对象。
------解决方案--------------------
------解决方案--------------------
这个问题看起来像是互斥的问题
你可以这么干,在线程里面,先运行s.wait();,用完s后运行s.notify();
就像这样
- Java code
public void run(){ s.wait(); ... s.notify();}
------解决方案--------------------
不好意思,原先说的方法是错的,wait()和notify()是用于同步的,不是用于互斥的
还是用synchronized方法好了
- Java code
public class Test{ public static void main(String[] args) { StringBuilder s = new StringBuilder(); Object lock = new Object(); for (int i = 0; i < 10; i++) { new TestThread(i, s, lock).start(); } }}class TestThread extends Thread{ private int i; //线程编号 private StringBuilder s; //要处理的字符串 private Object lock; //互斥的工具 public TestThread(int i, StringBuilder s, Object lock) { this.i = i; this.s = s; this.lock = lock; } public void run() { while (true) { synchronized (lock) { s.append(i); //将自己的编号添加到字符串中 System.out.println(s); //打印这个字符串被哪些线程调用过 } try { Thread.sleep(1000); //这里停一秒为了便于观察结果 } catch (InterruptedException e) { e.printStackTrace(); } } }}
------解决方案--------------------