首页 > 解决方案 > 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

//结束输出

标签: javamultithreading

解决方案


实际上,由于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 类将从构造函数中获取对象,而不是创建一个新实例。因此同步更成功。


推荐阅读