二、创建进程和线程

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() 方法,只能调用一次,否则报错:

  

原文地址:https://www.cnblogs.com/zhoanghua/p/9292145.html

时间: 2024-11-08 14:21:41

二、创建进程和线程的相关文章

Java 多线程详解(二)------如何创建进程和线程

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和线程的理解,那么在Java 中如何创建进程和线程呢? 1.在 Windows 操作系统中创建进程 在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程.更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例): 第一步:windows+R,

【归纳总结】Unix/linux下的进程管理(二):创建进程的函数及其应用、对比

创建进程的函数fork().vfork()和execl() 本次内容主要介绍Unix/linux下2个创建进程的函数fork和vfork以及它们的差别. 1.fork函数 (1)函数的格式 #include <unistd.h> pid_t fork(void); 函数功能: 主要用于以复制正在运行进程的方式来创建新的进程,其中新进程叫做子进程,正在运行的进程叫做父进程. 返回值: 函数调用成功时,父进程返回子进程的PID,子进程返回0,函数调用出错时,父进程返回-1,子进程没有被创建. 注意

Dalvik虚拟机进程和线程的创建过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923484 我们知道,在Android系统中,Dalvik虚拟机是运行Linux内核之上的.如果我们把Dalvik虚拟机看作是一台机器,那么它也有进程 和线程的概念.事实上,我们的确是可以在Java代码中创建进程和线程,也就是Dalvik虚拟机进程和线程.那么,这些Dalvik虚拟机所创建的进程 和线程与其宿主Linux内核的进程和线程有什么关

Python自动化开发,Day10 - 进程、线程、协程

本章内容 操作系统发展史介绍 进程与线程的区别 python GIL全局解释器锁 线程 语法 join 线程锁Lock\Rlock\信号量 将线程变为守护进程 Event时间 Queue队列 生产者消费者模型 进程 语法 进程间通讯 进程池 一.操作系统发展史介绍 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存

进程与线程之间的区别及联系

一.定义: 1.进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动.是系统进行资源分配和调度的独立单位,也是基本的执行单元.是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的活动. 进程结构特征:由程序.数据和进程控制块三部分组成.具有独立性.并发性.异步性和动态性的特点. (1).进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)--存储处理器执行的代码,数据区域(data regio

Python(十) 进程、线程、协程篇

本节内容 1.操作系统发展史    2.进程.与线程区别    3.Python GIL全局解释器锁    4.线程        1.语法        2.join        3.线程锁 Lock.RLock.信号量        4.将线程变为守护进程        5.Event事件        6.queue队列        7.生产者消费者模型        8.Queue队列        9.开发一个线程池    5.进程        1.语法        2.进程间

Python基础 - 第九天 - paramiko模块、进程、线程

本篇内容: 1.paramiko模块使用 2.进程.线程简介 3.python调用线程的方法 4.join - 等待线程执行 5.守护线程 6.GIL - 全局解释器锁 7.互斥锁 8.信号量 9.事件 10.队列 一.paramiko模块使用 1.paramiko模块简介 ? paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric

CPU的核、进程和线程

转自https://www.cnblogs.com/-new/p/7234332.html 一.CPU与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 所谓的4核8线程,4核指的是物理核心.通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程. 在操作系统看来是8个核,但是实际上是4个物理核. 通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核. 单核cpu和多核cpu 都是一个cpu,不同的是每个cpu

程序、进程与线程

一.程序 程序是存储在磁盘上, 包含可执行机器指令和数据的静态实体. 即进程或者任务是处于活动状态的计算机程序. 二.进程 进程就是运行中的程序. 一个运行着的程序,可能有多个进程.进程在操作系统中执行特定的任务. 1.分类:进程一般分为交互进程.批处理进程和守护进程三类.守护进程总是活跃的,一般是后台运行. 守护进程一般是由系统在开机时通过脚本自动激活启动, 或者由超级用户root来启动. 2.查看进程  :ps /  ps axu /  ps  -efl 3.获取进程号:getpid 4.创