什么是并行和并发?

并发和并行是即相似又有区别:(微观)

并行:指两个或多个事件在同一时刻发生; 强调的是时间点.

并发:指两个或多个事件在同一时间段内发生; 强调的是时间段.

  

  进程和线程的区别?

进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的,又称为轻型进程或进程元。 因为一个进程中的多个线程是并发运行的,那么从微观角度上考虑也是有先后顺序的,那么哪个线程执行完全取决于CPU调度器,程序员是控制不了的。我们可以把多线程并发性看作是多个线程在瞬间抢CPU资源,谁抢到资源谁就运行,这也造就了多线程的随机性。

  怎么创建进程?

创建进程的方式有两种,我以windows上的记事本为例:

  1. package com.StadyJava.day14;
  2.  
  3. import java.io.IOException;
  4.  
  5. public class ProcessDemo {
  6. public static void main(String[] args) throws Exception {
  7. //方法1:使用Runtime
  8. Runtime runtime=Runtime.getRuntime();
  9. runtime.exec("notepad");
  10.  
  11. //方法2:ProcessBuild
  12. ProcessBuilder processBuilder=new ProcessBuilder("notepad");
  13. processBuilder.start();
  14. }
  15. }

运行代码,此时会生成两个记事本。

我也尝试过启动其他的程序,但是计算器不认识,只有notepad这种计算机自带的才认识。

如果想要启动其他的程序,只能写上绝对路径

  1. ProcessBuilder processBuilder=new ProcessBuilder("E:\\shuyunquan\\TIM\\Bin\\TIM.exe");
  2. processBuilder.start();

这样我测试了,是可以的,但是没意思,这样你写了程序发布了也搞怪不了,别人电脑上的路径和你不一样。。。

接下来讲解线程。

下图是线程的一些常用的方法

创建进程的两个方法已经知道了,接下来看看创建线程的两个方法

创建线程方法1:使用继承Thread类

  1. package com.StadyJava.day14Thread;
  2.  
  3. import java.lang.Thread;
  4.  
  5. class Music extends Thread{
  6.  
  7. public void run() {
  8. for (int i = 0; i < 50; i++) {
  9. System.out.println("听音乐"+i);
  10. }
  11. }
  12. }
  13.  
  14. public class MusicThread {
  15. public static void main(String[] args) {
  16. for (int i = 0; i < 50; i++) {
  17. System.out.println("打游戏"+i);
  18. if (i == 10) {
  19. Music music=new Music();
  20. music.start();
  21. }
  22. }
  23. }
  24. }

注意,继承了Thread类之后要重写run方法,而且在调用的时候,只能使用start方法,不能调用run方法,切记!

输出的结果是在打游戏10之后,下面的打游戏和听音乐都是随机出现,因为主线程main和线程music在抢占资源,谁抢到谁执行,所以输出的结果是随机的

(注意!我使用Idea输出的结果是顺序的,不是随机的。我同学和我一样的代码使用Eclipse结果是随机的,我自己复制到Eclipse之后偶尔随机,Idea是死都不随机,这个我解决不了,希望以后知道原因或者有人告诉我)

创建线程的方法2:实现Runnable接口

其实Thread类也是实现了Runnable接口的,所以这个方法我感觉是本源??

  1. package com.StadyJava.day14Thread;
  2.  
  3. import java.lang.Runnable;
  4.  
  5. class MusicRun implements Runnable{
  6.  
  7. public void run() {
  8. for (int i = 0; i < 50; i++) {
  9. System.out.println("听音乐"+i);
  10. }
  11. }
  12. }
  13.  
  14. public class MusicRunnable {
  15. public static void main(String[] args) {
  16. for (int i = 0; i < 50; i++) {
  17. System.out.println("打游戏"+i);
  18. if (i == 10) {
  19. Runnable music=new MusicRun();
  20. Thread thread=new Thread(music);
  21. thread.start();
  22. }
  23. }
  24. }
  25. }

没什么特别的,就是生成一个runnable的对象,然后Thread对象加载进这个Runnable对象,最后start方法调用一下就完事了。这个结果我的Idea依然是显示的不符合我的期望的。

上面两种创建线程的方式是最常用的方式,一般也就足够了,下面介绍一下不怎么常用的

创建线程的方法3:匿名内部类创建线程

匿名内部类的格式:new 接口(){}  应该是这样的,待补充

其实匿名内部类创建线程还是使用上面的两种方式,只不过那个Music类我不需要去定义了,这就是匿名内部类,看代码吧

  1. package com.StadyJava.day14Thread;
  2.  
  3. import java.lang.Runnable;
  4.  
  5. class MusicRun implements Runnable{
  6.  
  7. public void run() {
  8. for (int i = 0; i < 50; i++) {
  9. System.out.println("听音乐"+i);
  10. }
  11. }
  12. }
  13.  
  14. public class MusicRunnable {
  15. public static void main(String[] args) {
  16. for (int i = 0; i < 50; i++) {
  17. System.out.println("打游戏"+i);
  18. if (i == 10) {
  19.  
  20. //匿名内部类的形式1,使用接口
  21. new Thread(new Runnable() {
  22.  
  23. public void run() {
  24. for (int i = 0; i < 50; i++) {
  25. System.out.println("听音乐"+i);
  26. }
  27. }
  28. }).start();
  29.  
  30. //匿名内部类的形式2,使用继承类
  31. new Thread(){
  32. public void run() {
  33. for (int i = 0; i < 50; i++) {
  34. System.out.println("听音乐"+i);
  35. }
  36. }
  37. }.start();
  38. }
  39. }
  40. }
  41. }

这回,输出的结果总算是符合我的预期了,可能是线程变成了3个,抢占资源激烈了些。。。

学了两种常见的创建线程的方法之后,他们之间有什么区别呢?

Thread创建线程和Runnable创建线程的区别

我写个例子,吃苹果大赛,3个人参加比赛,先使用继承Thread类创建线程的方式,代码如下:

  1. package com.StadyJava.day14;
  2.  
  3. class Person extends java.lang.Thread{
  4.  
  5. private int num=50;
  6. public Person(String name){
  7. super(name);
  8. }
  9.  
  10. public void run() {
  11. for (int i = 0; i < 50; i++) {
  12. if (num >0) {
  13. System.out.println(super.getName()+"吃了编号为"+num--+"的苹果");
  14. }
  15.  
  16. }
  17. }
  18. }
  19.  
  20. public class EatAppleThread {
  21. public static void main(String[] args) {
  22. //创建3个人,去参加吃苹果大赛
  23. new Person("许嵩").start();
  24. new Person("林俊杰").start();
  25. new Person("蜀云泉").start();
  26.  
  27. }
  28. }

这个输出的结果,就是许嵩,林俊杰,蜀云泉每个人都吃了50 个

Java进程线程笔记的更多相关文章

  1. Java进程&线程(整理)

    Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...

  2. Java进程&线程(一)

    Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...

  3. 【Java】PS-查看Java进程-线程数

    PS-查看Java进程-线程数 ps 线程 个数_百度搜索 查看进程的线程数命令 - CSDN博客 java命令行运行jar里的main类 - coderland - 博客园

  4. java进程/线程;堆和栈;多线程

    一.进程和线程 进程:在内存中运行的应用程序,一个exe是一个进程. 如:ps -exf  可以查看各个应用的进程,其中ppid为父进程: ps aux | egrep '(cron|syslog)' ...

  5. JAVA 进程线程详解

    线程和进程 一.进程 进程是指运行中的程序,比如我们使用QQ,就启动该进程分配内存空间. 进程是程序的一次执行过程,或是正在运行的一个程序.是一个动态的过程:有它自升的产生,存在和消亡的过程 二.线程 ...

  6. Java进程线程理解

    一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 多线程能满足程序员编写高效率的程序 ...

  7. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  8. Android(java)学习笔记160:Framework运行环境之 Android进程产生过程

    1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...

  9. Android(java)学习笔记103:Framework运行环境之 Android进程产生过程

    1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...

随机推荐

  1. Jenkins+VS项目持续集成

    软件安装 安装包下载连接:https://jenkins.io/download/ 安装步奏:略 账户名:admin 密码:C:\Program Files (x86)\Jenkins\secrets ...

  2. web框架开发-Django的Forms组件

    校验字段功能 针对一个实例:用户注册. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) ...

  3. SpringBoot实战(八)之RabbitMQ

    什么是RabbitMQ? RabbitMQ 是一个消息代理.它的核心原理非常简单:接收和发送消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,Rabb ...

  4. C++ cmake

    cmake_minimum_required(VERSION 2.8) project(helloworld) option add_exectuable 告诉工程生成一个可执行文件. add_lib ...

  5. Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)

    专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob.Redzone.Padding. Linux常见的内存访问错误有: 越界访问(out of bound ...

  6. webpack4配置详解之新手上路初探

    前言 经常会有群友问起webpack.react.redux.甚至create-react-app配置等等方面的问题,有些是我也不懂的,慢慢从大家的相互交流中,也学到了不少. ​ 今天就尝试着一起来聊 ...

  7. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路

    这也许是我大学生涯最后一次参加数学建模比赛了吧,这次我们选择的问题是E题,以下是我们解题时候的一些思路.很多不易体现的项目产生对环境造成影响的指标可以由一些等同类型的指标来代替,如土地.森林植被被破环 ...

  8. Python Revisited Day 13 (正则表达式)

    目录 13.1 Python的正则表达式语言 13.1.1 字符与字符类 13.1.2 量词 {m, n} ? + * 组与捕获 ?:可以关闭捕获 断言与标记 13.2 正则表达式模块 正则表达式模块 ...

  9. OracleSql语句学习(三)

    --在SELECT子句中出现的函数或表达式会在结果集中作为字段名,这样的可读性差,因此可以为--这样的字段添加别名(别名中不能出现空隔,除非是用双引号括起来的)--别名中如果希望包含空隔或者区分大小写 ...

  10. centos值cron-计划任务

    一.crond简介 crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具.并且会自动启动cro ...