日期:2014-05-20  浏览次数:20802 次

关于不同Thread中判断String是否存在
传入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对象。
------解决方案--------------------
探讨
这个变量只需存在Thread里不用回传
所以我想是否在Thread里建个static变量就可以使用?

------解决方案--------------------
这个问题看起来像是互斥的问题

你可以这么干,在线程里面,先运行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();
            }
        }
    }
}

------解决方案--------------------
探讨
我在该Tread里加一个方法如下是否可以?
public synchronized static String sappend(String filter,String s1,String s2){
filter=filter+s1+"$"+s2+";";