java 进程,线程,并行,并发,wait,sleep - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/03 09:09:06 2023/08/03
712 1 1
【摘要】 Java进程是指操作系统中正在运行的一个Java程序实例。每个Java进程都有自己的内存空间,可以独立运行,并且可以与其他进程进行通信。 Java线程是进程中的一个执行单元,一个进程可以有多个线程。线程是独立运行的,可以同时执行多个任务。Java线程是通过Thread类来创建和管理的。 并行是指两个或多个任务在同一时刻同时执行,需要多个执行单元。在Java中,可以通过多线程来实现并行执行。 ...

Java进程是指操作系统中正在运行的一个Java程序实例。每个Java进程都有自己的内存空间,可以独立运行,并且可以与其他进程进行通信。 Java线程是进程中的一个执行单元,一个进程可以有多个线程。线程是独立运行的,可以同时执行多个任务。Java线程是通过Thread类来创建和管理的。 并行是指两个或多个任务在同一时刻同时执行,需要多个执行单元。在Java中,可以通过多线程来实现并行执行。 并发是指两个或多个任务在同一时间段内交替执行,需要一个执行单元。在Java中,可以通过线程的调度来实现并发执行。 wait是Object类中的一个方法,用于使线程进入等待状态,直到其他线程调用notify或notifyAll方法唤醒它。 sleep是Thread类中的一个方法,用于使线程进入休眠状态,暂停执行一段时间。 以下是一个简单的示例代码,展示了如何创建线程并实现并行执行:

javaCopy codepublic class ParallelExecutionExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new Task("Task 1"));
        Thread thread2 = new Thread(new Task("Task 2"));
        
        thread1.start();
        thread2.start();
    }
}
class Task implements Runnable {
    private String name;
    
    public Task(String name) {
        this.name = name;
    }
    
    public void run() {
        System.out.println("Executing " + name);
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println(name + " finished");
    }
}

以上代码创建了两个线程,分别执行名为"Task 1"和"Task 2"的任务。在任务执行的过程中,通过sleep方法使线程休眠一秒钟,模拟任务的耗时操作。最终输出每个任务的执行结果。由于使用了多线程,所以两个任务可以并行执行,互不影响。

wait方法和sleep方法的区别在于:

  • wait方法属于Object类,是用于线程之间的协作的,调用wait方法会使当前线程进入等待状态,并释放对象的锁,直到其他线程调用notify或notifyAll方法来唤醒它。wait方法必须在synchronized块或方法中调用。
  • sleep方法属于Thread类,是用于线程的休眠的,调用sleep方法会使当前线程进入休眠状态,不会释放对象的锁。sleep方法可以在任何地方使用。 以下是修改后的示例代码,展示了如何使用wait和sleep方法:
javaCopy codepublic class ParallelExecutionExample {
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread1 = new Thread(() -> {
            synchronized (task) {
                try {
                    System.out.println("Executing Task 1");
                    task.wait(); // 线程1进入等待状态
                    System.out.println("Task 1 resumed");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread thread2 = new Thread(() -> {
            synchronized (task) {
                System.out.println("Executing Task 2");
                try {
                    Thread.sleep(1000); // 线程2休眠1秒钟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                task.notify(); // 唤醒等待的线程1
                System.out.println("Task 2 finished");
            }
        });
        thread1.start();
        thread2.start();
    }
    static class Task {
    }
}

在这个示例中,线程1先执行,进入synchronized块后调用wait方法,进入等待状态。然后线程2执行,进入synchronized块后调用sleep方法,使线程休眠1秒钟。1秒钟后,线程2调用notify方法唤醒等待中的线程1,并输出相应的信息。最终输出结果为:

plaintextCopy codeExecuting Task 1
Executing Task 2
Task 2 finished
Task 1 resumed

这个示例展示了wait和sleep的不同用途和效果。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(1

抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。