正如我们所知,没有任何规定可以防止多个线程使用start()
方法调用run()
方法。我确实创建了两个对象m1
和m2
都调用同一个线程来运行。
我需要在第二个对象开始执行之前,通过调用线程来确保第一个对象完成(m1.start
)其执行。
我的问题是为什么我不能在我创建的线程(即MyThread1
)中使用与
关键字?run()
方法同步的
我尝试在我创建的线程中使用“同步”来运行()方法,但它给出了任意输出(换句话说,m2
不等待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 ....");
}
}
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 ");
}
}
}
}
}
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()
)开始执行。
同步实例方法只会妨碍对类的同一实例的并发访问。如果run方法是静态的,您将看到预期的效果。但我不建议将run方法设置为静态。事实上,如果它要保持当前的功能,就不能。你应该考虑的是使用<代码> M1。join()等待m1完成。如果有多个线程彼此等待,另一种效果更好的方法是使用CyclicBarrier或倒计时锁存器。
此代码片段:
public synchronized void run() {
//code
}
在语义上等同于:
public void run() {
synchronized(this) {
//code
}
}
请注意此
参考。这意味着使用相同的This
引用(锁定对象)的所有synchronized
块都是互斥的。然而,您正在创建两个线程(对象),每个线程都在不同的此
引用上同步。
有几种方法可以改进代码:
public class Mythread1 implements Runnable //...
然后:
Runnable r = new Mythread1();
Thread m1 = new Thread(r);
Mythread1 m2 = new Thread(r);
但是,只有当两个线程共享Mythread1
runnable时,这才有效。
将一些任意的lock
对象传递给Mythread1
的两个实例,然后使用:
synchronized(lock) {
//code
}
从Java5开始,有更复杂的同步代码的方法,但这种方法对于简单的情况是好的。
你可以打电话:
m1.start();
m1.join();
m2.start();
这样就行了。
本文向大家介绍我们可以在Java中使用此关键字调用方法吗?,包括了我们可以在Java中使用此关键字调用方法吗?的使用技巧和注意事项,需要的朋友参考一下 Java中的“ this”关键字在实例方法或构造函数中用作对当前对象的引用。是的,您可以使用它来调用方法。但是,您只能从实例方法(非静态)中调用它们。 示例 在下面的示例中,Student类具有一个私有变量名称,具有setter和getter方法,
问题内容: 我知道jython允许我们从任何Java的类文件中调用Java方法,就好像它们是为python编写的一样,但是相反的可能吗? 我已经有很多用python编写的算法,它们在python和jython上都可以很好地工作,但是它们缺少适当的GUI。我计划将GUI与Java一起使用,并保持python库完整。我无法使用jython或python编写良好的GUI,也无法使用python编写良
问题内容: 我们可以重载Java中的方法吗? 问题答案: 您 可以 重载该方法,但仅在JVM启动您的类时使用。例如: 从命令行运行时,即使指定一个或两个命令行参数,该命令也 始终会 打印。 当然,您可以从代码中自己调用该方法-此时将应用常规的重载规则。 编辑:请注意,您可以使用varargs签名,因为从JVM的角度来看,这是等效的:
问题内容: 有人可以告诉我,如何在类级别调用方法吗? 假设我有一个如下所示的类,那么我们可以在类级别调用test1Method吗?如果不正确,请告诉我原因。 问题答案: 不,您不能在类下直接拥有方法调用语句或任何其他语句。根据JLS第8节-类的规定: 类的主体声明成员(字段和方法以及嵌套的类和接口),实例和静态初始化器以及构造函数(第8.1.6节)。 您必须在那些成员(某些方法),初始化程序或构造
问题内容: 我知道Python提供了API,因此您可以在C代码中调用Python解释器,但是我想要的却是相反的。 我的程序需要使用一些C API,所以代码必须用C编写。但是我也想用Python打包程序。这意味着我想在Python中调用这些C函数或可执行文件。那可能吗? 如果我希望C代码成为一个库,这意味着我将它与Python 中的可能的链接一起使用,该怎么做?那可能吗?如果我将C代码写入可执行文件
本文向大家介绍我们可以在MySQL中使用ORDER BY NULL吗?,包括了我们可以在MySQL中使用ORDER BY NULL吗?的使用技巧和注意事项,需要的朋友参考一下 是的,我们可以做到 注–在MySQL 5.7之前,ORDER BY NULL很有用,但在MySQL 8.0中,例如,最后不需要指定ORDER BY NULL以抑制隐式排序。 让我们首先创建一个表- 使用插入命令在表中插入一些