1

我有一个java线程代码。我有 3 个线程,我给它们都起了名字。2 个消费者线程名称Consumer1Consumer2. 一个名为 的生产者线程Producer。我有一个同步方法,我尝试比较线程的名称。我希望如果线程名称是 consumer2,我希望它休眠一段时间。像这样:

public synchronized String getReferer()
    {
        try{
            String threadName = Thread.currentThread().getName();
            System.out.println("Thread name: "+threadName);
            System.out.println(" compatre"+threadName=="Consumer2");
            if(threadName == "Consumer2"){
                System.out.println("It is consumer2. ...wait, you #$%^!!!");
                //this.wait();
            }
        }catch(Exception e){
            this.displayAndExit(e);
        }
        String line = "";
        int i = 0;
        try{
            finished = 0;
            if(this.hostnames2.isEmpty()){
                line = null;
            }else{
                line = this.hostnames2.take();
            }
        }catch(Exception e){
            this.displayAndExit(e);
        }
        return line;
    }
}

我一个接一个地启动所有线程,第一个生产者和消费者。如果我在所有地方都可以看到 threadName,会发生Consumer1什么Consumer2。但是在第二个sop中我看到了这样的东西!!!

线程名称:Consumer2 false

现在,由于方法是同步的,因此线程在进入时会对其进行锁定。因此,如果是 Consumer2,那么当两个语句都背靠背时,它与字符串“Consumer2”的比较怎么会失败?

这是线程的主要方法和调用。

public class OffensiveFilterApplicator 
{
    public static void main(String [] args)
    {
        String pathToCSV = "src/unique_referer_dump3.txt";
        CSVResourceHandler csvResHandler = new CSVResourceHandler(pathToCSV);
        HostnameFileData hfd = new HostnameFileData();
        HostnameReader hr = new HostnameReader(hfd, csvResHandler.getCSVFileHandler());
        VexigoCallOps vco = new VexigoCallOps(hfd);
        Thread producer = new Thread(hr);
        Thread consumer1 = new Thread(vco);
        Thread consumer2 = new Thread(vco);
        producer.setName("Producer");
        producer.start();
        consumer1.setName("Consumer1");
        consumer2.setName("Consumer2");
        consumer1.start();
        consumer2.start();
    }
}
4

2 回答 2

17

您不能使用==. 你必须使用equals.

在“.equals”和“==”之间阅读更多 内容?

于 2012-06-28T10:38:34.193 回答
0

线程不存储线程名称的字符串。它将名称存储为 a char[],因此每次您调用时,getName()您实际上都会得到一个不同的对象。

Thread t = Thread.currentThread();
for (int i = 0; i < 10; i++)
    System.out.println(Integer.toHexString(System.identityHashCode(t.getName())));

打印类似的东西

4318f375
1b17a8bd
2e471e30
3f0ef90c
7000a32b
39d8957f
3a3ee284
768965fb
36867e89
37dd7056

为什么它不存储String给定的setName我不知道。我认为它是出于历史原因。

于 2012-06-28T10:56:25.360 回答