English 中文(简体)
在 java 中, 我们能使用同步的运行( ) 方法吗?
原标题:Can we use synchronised for run() method in java?

由于我们知道没有规定防止使用 run () 方法使用 start () 方法使用一个以上的线条来调用 run () 方法。 我确实创建了两个对象 m1 > m2 , 两者都调用同一个线条来调用。

我要确保第一个对象完成( m1.start ), 在第二个对象执行开始之前拨打线条, 从而完成执行 。

我的问题是为什么我无法在我创建的线索(即 MyThread1 )中使用 syncronized 关键词,加上 run () <() 方法?

我尝试用“ 同步化” 来运行( ) 我创建的线条中的方法, 但是它提供了任意输出( 换句话说, < code> m2 不等待 < code> m1 完成执行 ) 。

你可以在程序底部看到我得到的输出。

public class ExtendedThreadDemo {

    public static void main(String[] args) {    
        Mythread1 m1 =new Mythread1();
        Mythread1 m2 =new Mythread1();
        m1.start();
        m2.start();
        System.out.println(" main thread exiting ....");
    }
}

MyThread

public class MyThread1 extends Thread {

    public synchronized void run() {
        for(int i=1; i<5; i++) {
            System.out.println(" inside the mythread-1 i = "+ i);
            System.out.println(" finish ");

            if (i%2 == 0) {
                try {
                    Thread.sleep(1000);
                } catch(InterruptedException e) {
                     System.out.println(" the thread has been interrupted ");
                }
            }
        }
    }
}

Output

main thread exiting ....
inside the mythread-1 i = 1
finish
inside the mythread-1 i = 2
finish 
inside the mythread-1 i = 1
finish 
inside the mythread-1 i = 2
finish 
inside the mythread-1 i = 3
finish 
inside the mythread-1 i = 4
finish 
inside the mythread-1 i = 3
finish 
inside the mythread-1 i = 4
finish 

i=2 之后可以看到,第二个对象(即 m2.start() )开始执行。

问题回答

在拨打 m1.join () main 之前,先拨打 m2.start ()

制作方法 同步 只影响对 same 对象的方法的多次调用; %1 > > m2 是不同的对象,所以添加 synchronized 将无效。

此代码片段 :

public synchronized void run() {
  //code
}

语言等同于:

public void run() {
  synchronized(this) {
    //code
  }
}

注意 this 引用。 这意味着所有使用相同 this 引用( lock 对象)的 同步 区块都是相互排斥的。 但是,您正在创建两个线索( 对象), 每个线索都在不同的 this 引用上同步 。

有几种方法可以改进你的代码:

Use only one Runnable and create two threads:

public class Mythread1 implements Runnable //...

然后:

Runnable r = new Mythread1();
Thread m1 = new Thread(r);
Mythread1 m2 = new Thread(r);

但只有 mythread1 可运行的状态为状态, 因为它将被两个线索共享, 这才有效 。

Use the same lock instance

mythread1 中通过一些任意的 lock 对象,然后在两种情况下使用 mythread1 :

synchronized(lock) {
  //code
}

从爪哇五号开始,有更复杂的方法 来同步代码, 但对于简单案例来说,这个方法是好的。

Use Thread.join()

您可以拨打:

m1.start();
m1.join();
m2.start();

这招能用得上

同步实例方法只会阻碍同时访问同一类中的同一实例。 如果运行方法是静态的, 你会看到预期的效果 。 但我不建议将运行方法变成静态 。 事实上, 如果它要保持其当前功能, 您不能这样做 。 相反, 您应该考虑的是使用 m1. join () 来等待 m1 完成。 如果您有多个要等待对方的线条, 另一种方法效果更好 : http:// a href=” http://docs. oracle. com/javacle. com/javase/1. 5. 0/ docs/ java/java/ uva/ uttil/ concl/ conclation/ CyclicBarrier.html" rel=“ nofolpol” 标题= “ CyclicBarrier” < / a > 或 a href= "http://docs. com/java/ apie/ ajava/ va/ int/ currot/ const/ cott/ datchLatch.html" rel= " nonopol "





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...