当前位置: 代码迷 >> J2SE >> 关于不同Thread中判断String是否存在,该怎么处理
  详细解决方案

关于不同Thread中判断String是否存在,该怎么处理

热度:130   发布时间:2016-04-24 01:49:54.0
关于不同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+";";
  相关解决方案