Java 多线程详解(二)------如何创建进程和线程
在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和线程的理解,那么在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() 方法来创建进程
public class Runtime
extends Object
①、表示当前进程所在的虚拟机实例,每个Java应用程序都有一个Runtime类的Runtime ,允许应用程序与运行应用程序的环境进行接口。
②、由于任何进程只会运行与一个虚拟机实例当中,即只会产生一个虚拟机实例(底层源码采用 单例模式)
③、当前运行时可以从getRuntime方法获得。

由上面源码可以看到,构造器私有化了,即外部我们不能 new 一个新的 Runtime 实例,而内部给了我们一个获取 Runtime 实例的方法 getRuntime() 。
通过 Runtime 类创建一个 记事本的 进程
public class ProcessTest {
public static void main(String[] args) throws Exception {
Runtime run = Runtime.getRuntime();
//打开记事本
run.exec("notepad");
}
}
第二种方法:通过 ProcessBuilder 创建进程
public final class ProcessBuilder
extends Object
①、此类用于创建操作系统进程。
②、每个ProcessBuilder实例管理进程属性的集合。 start()方法使用这些属性创建一个新的Process实例。 start()方法可以从同一实例重复调用,以创建具有相同或相关属性的新子进程。

public class ProcessTest {
public static void main(String[] args) throws Exception {
//打开记事本
ProcessBuilder pBuilder = new ProcessBuilder("notepad");
pBuilder.start();
}
}
3、在 Java 中创建线程
第一种方法:继承 Thread 类
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();
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();
}
}
}
}
结果:
玩游戏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 接口
@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();
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();
}
}
}
}
第三种方法:使用匿名内部类创建线程
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 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- Java 多线程详解(三)------线程的同步
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- java多线程详解(1)-多线程入门
一.多线程的概念 线程概念 线程就是程序中单独顺序的流控制. 线程本身不能运行,它只能用于程序中. 说明:线程是程序内的顺序控制流,只能使用分配给程序的资源和环境. 进程:操作系统中执行的程序 程序是 ...
- Java多线程详解
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- java 多线程详解
一.重点 重点: 1.创建和启动线程 2.实现线程调度 3.实现线程同步 4.实现线程通信 1.为什么要学习多线程? 当多个人访问电脑上同一资源的时候,要用到多线程,让每个人感觉很多电脑同时为多个人服 ...
- Java多线程详解(转载)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用 ...
- Java多线程详解总结
一.基本概念 程序(program): 是为完成特定任务.用某种语言编写的一组指令的集合.即指一 段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是正在运行的一个程序.是一个 ...
- Java多线程详解——一篇文章搞懂Java多线程
目录 1. 基本概念 2. 线程的创建和启动 2.1. 多线程实现的原理 2.2.多线程的创建,方式一:继承于Thread类 2.3.多线程的创建,方式一:创建Thread匿名子类(也属于方法一) 2 ...
随机推荐
- 踩坑实录 使用 cardview 时报错 error: No resource identifier found for attribute 'cardCornerRadius' in package 'com.xxxxx.xxx'
在项目中引用 cardview 卡片布局,编译时 Android Studio 报出下面图片中红框标记的错误: 出现这种情况的原因在于没有导入 cardview 卡片布局相应的依赖包,因此我们需要在 ...
- python非转基因HTTP请求库--Requests: 让 HTTP 服务人类
快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其假设你已经安装了 Requests.如果还没有,去安装一节看看吧. 首先,确认一下: Requests 已安装 Req ...
- C语言编码风格_集锦_1
参考原地址: http://www.jb51.net/article/79257.htm <一> 在一个标准的C语言程序中, 最特殊的莫过于main函数了. 函数大体上分为内联函数(C99 ...
- E/MediaPlayer: Should have subtitle controller already set
原文链接:http://stackoverflow.com/questions/20087804/should-have-subtitle-controller-already-set-mediapl ...
- JavaWeb总结(九)—过滤器
一.Filter简介 Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:JSP.Servlet.静态文件.静态HTML等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限 ...
- Spark入门实战
星星之火,可以燎原 Spark简介 Spark是一个开源的计算框架平台,使用该平台,数据分析程序可自动分发到集群中的不同机器中,以解决大规模数据快速计算的问题,同时它还向上提供一个优雅的编程范式,使得 ...
- .NetCore上传多文件的几种示例
本章和大家分享的是.NetCore的MVC框架上传文件的示例,主要讲的内容有:form方式提交上传,ajax上传,ajax提交+上传进度效果,Task并行处理+ajax提交+上传进度,相信当你读完文章 ...
- Servlet(一)基础总结
一.Servlet概述 1.Java Servlet是基于Java的一种技术和标准,是独立于平台和协议,服务器端的java应用程序.与Applet相比.Applet运行在客户端,而Servlet运行在 ...
- 原生态JS实现banner图的常用所有功能
虽然,用jQuery实现banner图的各种效果十分简单快捷,但是我今天用css+js代码实现了几个banner图的常用功能,效果还不错. 此次,主要想实现以下功能: 1. banner图循环不间断切 ...
- 读书笔记 effective c++ Item 49 理解new-handler的行为
1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常.很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做.你仍然会看到这种旧行为,但是我会把关于它的讨 ...