处理同一对象的多个线程

时间:2015-06-07 11:23:53

标签: java multithreading

我有一个POJO BusStop,它有一个公共汽车站的名称和有多少乘客。

Colors

还有一个BusRide对象,它包含一个源BusStop,一个目的地BusStop以及目前有多少乘客。

var doc = new jsPDF();
var specialElementHandlers = {
    '#editor': function (element, renderer) {
        return true;
    }
};

$('#cmd').click(function () {
    doc.fromHTML($('#content').html(), 15, 15, {
        'width': 170,
        'elementHandlers': specialElementHandlers
    });
    doc.save('sample-file.pdf');
});

主要课程:

public class BusStop{
    private String name;
    private Integer passengers;
    //setters getters constructor
    public void removePassengers(Integer i){
        synchronized(passengers){
             this.passengers = this.passengers - i; // right now I allow them to go below zero for the sake of just testing threads;
        }
    }

    public void increasePassengers(Integer i){
        synchronized(passengers){
             this.passengers = this.passengers + i;
        }
    }
}

在我的主课程中,我想创建2个BusRide线程,这些线程将从源BusStop到目的地BusStop随机抽取乘客。但是我希望BusRide线程从我给它们的对象中获取乘客,但是他们有自己的BusStop对象实例。那么如何让两个线程在我给它的同一个BusStop对象上运行呢?

2 个答案:

答案 0 :(得分:1)

public void removePassengers(Integer i){
    synchronized(passengers){
         this.passengers = this.passengers - i; // right now I allow them to go below zero for the sake of just testing threads;
    }
}

public void increasePassengers(Integer i){
    synchronized(passengers){
         this.passengers = this.passengers + i;
    }
}

以上是错误的。它应该是

public synchronized void removePassengers(Integer i){
    this.passengers = this.passengers - i; // right now I allow them to go below zero for the sake of just testing threads;
}

public synchronized void increasePassengers(Integer i){
    this.passengers = this.passengers + i;
}

实际上,您正在对乘客进行同步,但是将乘客分配给同步块内的另一个值,从而使两个线程可以同时调用这些方法。如果您将变量final用作锁定,请始终创建变量{。}}。

答案 1 :(得分:0)

请试试这个。线程没有启动。

/ **  *  * / 包com.philips.webcms.foundation.catalog.products.utils.test;

/ **  * @author AV262488  * / 公共类ThreadTest {

/**
 * @param args
 */
public static void main(String[] args)
{
    BusStop a = new BusStop("Bus-stop 1", 50);
    BusStop b = new BusStop("Bus-stop 2", 45);
    BusStop c = new BusStop("Bus-stop 3", 62);

    Thread t1 = new Thread(new BusRide(a, b));
    Thread t2 = new Thread(new BusRide(a, c));
    t1.start();
    t2.start();

    System.out.println(a.getPassengers());

}

}