考虑以下代码:
public class Main {
public static void main(String[] args){
MyObject obj = new MyObject();
Thread1 t1 = new Thread1(100,'#',obj);
Thread1 t2 = new Thread1(100,'*',obj);
t1.start();
t2.start();
}
}
public class Thread1 extends Thread {
int myNum;
char myChar;
MyObject myObj;
public Thread1(int num, char c, MyObject obj){
myNum = num;
myChar = c;
myObj = obj;
}
public synchronized void run(){
for(int i = 1; i<myNum; i++){
if((i%10)==0)
System.out.println("");
System.out.print(myChar);
}
}
}
类MyObject是空类,没有任何空间。 我的问题是,为什么同步不能正常工作我同时以随机顺序打印'#'和' '而不是一个接一个地打印出来?
答案 0 :(得分:5)
同步会锁定对象的监视器。在您的情况下,您正在与每个线程对象进行同步,即针对线程A的监视器的线程A锁定和针对线程B的监视器的线程B锁定。因此他们没有互动。
我认为你的run()方法意味着以下内容:
public void run(){
synchronized (myObj) {
for(int i = 1; i<myNum; i++){
if((i%10)==0)
System.out.println("");
System.out.print(myChar);
}
}
}
如果这确实是myObj的预期用途,那么我也会建议以下更改;因为它有助于使代码更具可读性。
变化:
MyObject myObj;
为:
private final MyObject lock;
编辑另一种方法,它不会锁定myObj,而是锁定Thread1的Class实例。
public void run(){
doJob();
}
private static synchronized void doJob() {
for(int i = 1; i<myNum; i++){
if((i%10)==0)
System.out.println("");
System.out.print(myChar);
}
}
答案 1 :(得分:0)
您可以尝试将 thread.join(),等待执行完成后的第一个线程开始下一个
public class hilos {
public static void main(String[] args) throws InterruptedException{
MyObject obj = new MyObject();
Thread1 t1 = new Thread1(50,'#',obj);
Thread1 t2 = new Thread1(50,'*',obj);
Thread[] threads = {t1, t2};
start(threads);
}
public synchronized static void start(Thread[] threads) throws InterruptedException{
synchronized(threads){
for(int i=0; i < threads.length; i++) {
threads[i].start();
threads[i].join();
}
}
}
}
输出:
#########
##########
##########
##########
##########*********
**********
**********
**********
**********