java - JVM 在什么基础上为任务分配线程?提供了一个我在这里尝试过的例子
问题描述
//这个类包含任务。我做这个练习是为了理解多线程。我试图获取内部线程的名称,因为我想看看它们是如何执行的,即 Thread-0 进入块,但是当调用 sleep() 方法时,Thread-1 首先进入睡眠状态。我不确定这是怎么发生的,因为如果 Thread-0 先进入,那么 Thread-0 必须先睡眠太正确了?另外我的任务是在同步块内执行的,所以在线程 0 完成执行之前,线程 1 如何进入同步块。
我已经在下面发布了输出。
class Runner extends Thread {
private Object obj = new Object();
@Override
public void run() {
String[] someValues = { "Arun", "Kumar", "is", "an", "amazing", "person" };
synchronized (obj) {
System.out.println("Current thread entering synchronized block is " + Thread.currentThread().getName());
for (String getSomeValues : someValues) {
System.out.println("Current thread printing the value is " + Thread.currentThread().getName());
System.out.print(getSomeValues + " ");
try {
// Sleep pauses the program.
// It also throws InterruptedException so it must be
// handled.
System.out.println("\nThread BeforeSleep is " + Thread.currentThread().getName());
Thread.sleep(100);
System.out.println("\nThread AfterSleep is " + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
//主App类执行线程。
public class App {
public static void main(String[] args) {
Runner r1 = new Runner();
// The start() method starts the run method in Runner class.
r1.start();
Runner r2 = new Runner();
r2.start();
}
}
//代码的输出 //开始输出
当前进入同步块的线程为 Thread-0 当前线程打印值为 Thread-0 当前进入同步块的线程为 Thread-1 当前线程打印值为 Thread-1 Arun Thread BeforeSleep 为 Thread-1 Arun Thread BeforeSleep 为 Thread-0
线程 AfterSleep 是 Thread-0
Thread AfterSleep 为 Thread-1 当前线程打印值为 Thread-0 Kumar 当前线程打印值为 Thread-1
线程 BeforeSleep 是 Thread-0 Kumar 线程 BeforeSleep 是 Thread-1
线程 AfterSleep 是 Thread-0
Thread AfterSleep 是 Thread-1 当前线程打印的值是 Thread-1 当前线程打印的值是 Thread-0 是 Thread BeforeSleep 是 Thread-1 是 Thread BeforeSleep 是 Thread-0
线程 AfterSleep 是 Thread-1
Thread AfterSleep 是 Thread-0 当前线程打印的值是 Thread-1 当前线程打印的值是 Thread-0 一个线程 BeforeSleep 是 Thread-0
线程 BeforeSleep 是 Thread-1
Thread AfterSleep is Thread-0 当前线程打印的值为 Thread-0
Thread AfterSleep 是 Thread-1 当前线程打印的值是 Thread-1 惊人的 惊人的 Thread BeforeSleep 是 Thread-1
线程 BeforeSleep 是 Thread-0
Thread AfterSleep 是 Thread-1 当前线程打印的值是 Thread-1 人 Thread BeforeSleep 是 Thread-1
Thread AfterSleep 是 Thread-0 当前线程打印的值是 Thread-0 人 Thread BeforeSleep 是 Thread-0
线程 AfterSleep 是 Thread-1
线程 AfterSleep 是 Thread-0
//结束输出
解决方案
实际上,由于Java 线程同步,我想出了一个巧妙的方法 - Thread.sleep() 方法无法按预期工作
我改变了我的主要课程看起来像这样
public class App {
public static void main(String[] args) {
Object obj = new Object();
Runner r1 = new Runner(obj);
// The start() method starts the run method in Runner class.
r1.start();
Runner r2 = new Runner(obj);
r2.start();
}
}
并且 Runner 类将从构造函数中获取对象,而不是创建一个新实例。因此同步更成功。
推荐阅读
- laravel - 使用 CAS 进行身份验证,登录后重定向,Laravel
- gradle - Bazel 适合移动+桌面项目吗?
- json - JOLT 对纯 JSON 的重新排序
- gradle - Gradle Kotlin:如何将 groovy build.gradle 的 kotlin2js 插件转换为 build.gradle.kts?
- java - 使用条件更新避免异常(dynamoDB、Java)
- wordpress - 如何创建本地 Wordpress 站点的 .json 文件?
- c# - 使用 ASP.NET Core 和 Entity Framework Core 进行集成测试 - 如何在每次测试时恢复数据库中的测试数据?
- django - 在 Django Rest Framework 中创建新对象之前使用序列化器数据获取外部 API 信息
- python - 使用 1D 布尔数组从 3D RGB 图像中提取掩码
- amazon-web-services - 没有卷附加到正在运行的 mysql docker 容器 - AWS Elastic beanstalk 多容器 docker 应用程序