Java 多线程详解(二)------如何创建进程和线程
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790
在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和线程的理解,那么在Java 中如何创建进程和线程呢?
1、在 Windows 操作系统中创建进程
在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程。更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例):
第一步:windows+R,输入cmd,打开 cmd 命令提示符
第二步:在命令提示符中输入 notepad,按 Enter 键便会弹出记事本应用软件
PS:常用的windows 应用软件命令
1、regedit:打开注册表编辑器
2、control:打开控制面板
3、msconfig:打开系统配置
4、gpedit.msc:打开本地组策略
5、explorer:打开资源管理器
6、taskmgr:任务管理器
7、logoff:直接注销计算机
8、osk:打开屏幕键盘
9、calc:打开计算器
10、mspaint:调出画图软件
11、dxdiag:查看电脑详细配置信息
12、mstsc:打开远程桌面连接
13、systeminfo:查看计算机基本信息
14、notepad:打开记事本
2、在 Java 中创建进程
第一种方法:通过 Runtime 类的 exec() 方法来创建进程
1
2
3
4
5
|
public class Runtime
extends Object
①、表示当前进程所在的虚拟机实例,每个Java应用程序都有一个Runtime类的Runtime ,允许应用程序与运行应用程序的环境进行接口。
②、由于任何进程只会运行与一个虚拟机实例当中,即只会产生一个虚拟机实例(底层源码采用 单例模式)
③、当前运行时可以从getRuntime方法获得。
|
由上面源码可以看到,构造器私有化了,即外部我们不能 new 一个新的 Runtime 实例,而内部给了我们一个获取 Runtime 实例的方法 getRuntime() 。
通过 Runtime 类创建一个 记事本的 进程
1
2
3
4
5
6
7
8
9
|
public class ProcessTest {
public static void main(String[] args) throws Exception {
Runtime run = Runtime.getRuntime();
//打开记事本
run.exec( "notepad" );
}
}
|
第二种方法:通过 ProcessBuilder 创建线程
1
2
3
|
public final class ProcessBuilder
extends Object<br>①、此类用于创建操作系统进程。
②、每个ProcessBuilder实例管理进程属性的集合。 start()方法使用这些属性创建一个新的Process实例。 start()方法可以从同一实例重复调用,以创建具有相同或相关属性的新子进程。
|
1
2
3
4
5
6
7
8
9
|
public class ProcessTest {
public static void main(String[] args) throws Exception {
//打开记事本
ProcessBuilder pBuilder = new ProcessBuilder( "notepad" );
pBuilder.start();
}
}
|
3、在 Java 中创建线程
第一种方法:继承 Thread 类
1
2
3
|
public class Thread
extends Object
implements Runnable
|
步骤:1、定义一个线程类 A 继承于 java.lang.Thread 类
2、在 A 类中覆盖 Thread 类的 run() 方法
3、在 run() 方法中编写需要执行的操作
4、在 main 方法(线程)中,创建线程对象,并启动线程
创建线程类:A类 a = new A()类;
调用 start() 方法启动线程:a.start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.ys.thread;
class Thread1 extends Thread{
@Override
public void run() {
for ( int i = 0 ; i < 10 ;i++){
System.out.println( "播放音乐" +i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
for ( int i = 0 ; i < 10 ; i++){
System.out.println( "玩游戏" +i);
if (i== 5 ){
Thread1 th1 = new Thread1();
th1.start();
}
}
}
}
|
结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
玩游戏 0
玩游戏 1
玩游戏 2
玩游戏 3
玩游戏 4
玩游戏 5
玩游戏 6
玩游戏 7
玩游戏 8
玩游戏 9
播放音乐 0
播放音乐 1
播放音乐 2
播放音乐 3
播放音乐 4
播放音乐 5
播放音乐 6
播放音乐 7
播放音乐 8
播放音乐 9
|
注意:我们看结果,并不是出现 5 个先打游戏,然后在播放音乐,这是线程调度的结果,两个线程同时在争抢 CPU 的资源,即最后的结果,前面5个打游戏的必然先出现的,后面的啥时候出现播放音乐就看 CPU 怎么调度了,这是随机的。我们不能干涉。
第二种方法:实现 Runnable 接口
1
2
|
@FunctionalInterface
public interface Runnable
|
1、Runnable接口应由任何类实现,其实例将由线程执行。 该类必须定义一个无参数的方法,称为run 。
2、该接口旨在为希望在活动时执行代码的对象提供一个通用协议。此类整个只有一个 run() 抽象方法
步骤:1、定义一个线程类 A 实现于 java.lang.Runnable 接口(注意:A类不是线程类,没有 start()方法,不能直接 new A 的实例启动线程)
2、在 A 类中覆盖 Runnable 接口的 run() 方法
3、在 run() 方法中编写需要执行的操作
4、在 main 方法(线程)中,创建线程对象,并启动线程
创建线程类:Thread t = new Thread( new A类() ) ;
调用 start() 方法启动线程:t.start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Runnable1 implements Runnable{
@Override
public void run() {
for ( int i = 0 ; i < 10 ;i++){
System.out.println( "播放音乐" +i);
}
}
}
public class RunnableTest {
public static void main(String[] args) {
for ( int i = 0 ; i < 10 ; i++){
System.out.println( "玩游戏" +i);
if (i== 5 ){
Thread th1 = new Thread( new Runnable1());
th1.start();
}
}
}
}
|
第三种方法:使用匿名内部类创建线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public static void main(String[] args) {
for ( int i = 0 ; i < 10 ; i++){
System.out.println( "玩游戏" +i);
if (i== 5 ){
new Thread( new Runnable() {
@Override
public void run() {
for ( int i = 0 ; i < 10 ;i++){
System.out.println( "播放音乐" +i);
}
}
}).start();
}
}
}
|
注意:
1、启动线程是调用 start() 方法,而不是 调用 run() 方法。
解析:run()方法:在本线程内调用run()方法,和其他方法没有什么区别,可以重复多次调用;
start()方法:启动一个线程,实际上还是调用该Runnable对象的run()方法。
打开 Thread 类的源码,start()方法里面有一句:
private native void start0(); //native 关键字:本地程序调用
native关键字指的是Java本地接口调用,即是使用Java调用本地操作系统的函数功能完成一些特殊的操作,而这样的代码开发在Java中几乎很少出现,因为Java的最大特点是可移植性,如果一个程序 只能在固定的操作系统上使用,那么可移植性就将彻底丧失,多线程的实现一定需要操作系统的支持,那么start0()方法实际上就和抽象方法很类似,没有方法体,而是交给JVM 去实现,即在windows下的JVM可能使用A方法实现start0(),在linux下的JVM可能使用B方法实现start0(),在调用时并不会关心具体是何方式实现了start0()方法,只会关心最终的操作结果,交给 JVM去匹配了不同的操作系统。
2、不能多次启动同一个线程,即多次调用 start() 方法,只能调用一次,否则报错:
Java 多线程详解(二)------如何创建进程和线程相关推荐
- Java多线程详解(二)
评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡 ...
- Java多线程详解(如何创建线程)
嗨喽-小伙伴们我们又见面了, 前面一章,我们了解了线程的基本概念,从这一章,我们开始学习如何创建一个线程.总的说来,在java中,有四种创建线程的方式: 1. 继承Thread类 2. 实现Runna ...
- Java多线程详解(基本概念)
嗨喽-小伙伴们我来啦, 从本章开始,我们就要开始介绍Java中一个非常重要的概念-----多线程.线程化思想是计算机领域的重要思想,有了线程,咱编写的程序才能更为高效准确地运行起来. 首先,咱来了解一 ...
- Java多线程详解(线程不安全案例)
嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1. Java多线程详解(基本概念) 2. Java多线程详解(如何创建线程) ...
- Java 多线程详解(五)------线程的声明周期
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...
- Java 多线程详解(四)------生产者和消费者
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...
- Java 多线程详解(三)------线程的同步
Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...
- 【运维能力提升计划-3】Java多线程详解
Java多线程详解 学习链接 Java.Thread 线程简介 线程 进程 多线程 线程实现 Thread 继承Thread类 调用run方法只有主线程一个线程,调用start方法生成子线程与主线程并 ...
- Delphi多线程详解CreateThread、TThread,以及线程间通过临界区(CriticalSection)实现同步
在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:ht ...
最新文章
- 软件测试培训需要学习什么
- 广州种植牙需要多少钱
- CSDN光合计划-纯干货-推荐几个Java全系列学习教程
- Git Flow工作流图
- 李名洋(1983-),男,中国电信股份有限公司云计算分公司数据分析师。
- [转]细说Redis监控和告警
- 同步代码时忽略maven项目 target目录
- 华为交换机接口允许vlan通过_VLAN工作原理之TRUNK:控制允许通过的VLAN(Allowed List)...
- 改变输出格式,提高手机照片质量
- 下载pyboard的flash中的驱动程序_HASP加密狗驱动程序没有安装成功如何解决
- Markdown常用快捷键
- android微信支付指纹支付密码错误,安卓微信支付怎么设置指纹锁
- 定时网页截图php,浏览器实现网页定时自动截图
- rtorrent ubuntu端命令行种子下载器
- linux4 系统下载,SysLinux 4.0.4 下载
- [JZOJ5199]Fiend
- ignore在mysql中什么意思_ignore是什么意思
- 从会种田到“慧种田”,传感技术成“刚需”!
- 星特朗望远镜怎么样_星特朗天文望远镜怎么样|使用体验
- 2020-08-26
热门文章
- 动态向客户端注册脚本文件
- .NET利用委托实现动态查询
- ASP.NET Web Pages 和 WebMatrix (Razor Syntax、Forms、Data、Grid、Chart、Files、Images、Video)的学习资源...
- Cherry,你会喜欢这种手机!
- 【个人笔记】OpenCV4 C++ 快速入门 12课
- 巨量引擎初级营销认证题库_“移动营销,智赢未来”巨量引擎4月招商加盟专场沙龙圆满落幕...
- vue input只能输入正整数_前端开发:Vue中获取input输入框值的方法
- Linux glib命令行解析GOptionEntry使用
- 解决: Android.bp ninja: error: unknown target MODULES-IN-xxx报错
- 进程间传递文件描述符--sendmsg,recvmsg(可用)