繁体   English   中英

在Java中锁定线程不起作用

[英]Locking threads in java doesnt work

我对多线程有一个简单的问题,我无法解决。 我尝试了同步方法并使用锁,但是这些方法均无效,因此希望这里有人可以帮助我。

public void startThreads(ArrayList<ArrayList<Tocka>> pLista) {
        ScheduledThreadPoolExecutor eventPool = new ScheduledThreadPoolExecutor(pLista.size());
            for(int i=0; i<pLista.size(); i++) {
                eventPool.execute(new Dretva(pLista.get(i),i));
            }
    }

public synchronized void run() {
        lock.lock();
        System.out.print(this.id + ". ");
        optimalnost.printOrder(this.lista);
        double distance = optimalnost.getDistanceList(this.lista);
        System.out.println(" - " + distance);
        System.out.println();
        checkMin(distance);
        lock.unlock();
    }

我从带有列表列表的测试类startThreads方法调用(startThreads和线程在单独的类中)。 在类Dretva(线程)中,我有一个运行代码,该代码执行带有列表的一些计算,该列表作为参数传递并打印计算。 在我的示例中,有6个列表,而我试图通过所有列表,但当时只有一个。 当我不使用线程时,它可以正常工作,但是使用此类线程时,我会陷入混乱并混排输出。

我需要帮助,以便在活动线程未完成时如何使其他线程等待。

这是我的问题的屏幕截图:

在此处输入图片说明

同步的方法在该对象上同步,而不是全局同步。

只需传入一个对象并对其进行同步:

public void startThreads(ArrayList<ArrayList<Tocka>> pLista) {
    final Object lockOb = new Object();

    ScheduledThreadPoolExecutor eventPool = new ScheduledThreadPoolExecutor(pLista.size());
        for(int i=0; i<pLista.size(); i++) {
            eventPool.execute(new Dretva(lockOb, pLista.get(i),i));
        }
}

Object lockOb;

public void run() {
    synchronized(lockOb) {
       System.out.print(this.id + ". ");
       optimalnost.printOrder(this.lista);
       double distance = optimalnost.getDistanceList(this.lista);
       System.out.println(" - " + distance);
       System.out.println();
       checkMin(distance);
    }
}       

现在,所有对象都共享一个锁对象,并且都在该对象上进行同步,因此一次只能运行一个。 尽管您创建了很多线程,然后故意使它成为一个线程,所以一次只能执行其中的一个线程,但这确实完全使用了线程。

附带说明try finally ,对于需要解锁的任何锁定对象,都应始终使用try finally块。

您的同步方法run是成员方法。 这意味着您正在对象的实例上进行同步。 由于您创建了多个实例,因此每个实例都获得了对不同对象的锁定。 如果希望跨实例同步访问,则必须显式提供互斥锁以锁定或对所有实例使用静态常量互斥锁进行同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM