什么是并行和并发?

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

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

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

  

  进程和线程的区别?

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

  怎么创建进程?

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

package com.StadyJava.day14;

import java.io.IOException;

public class ProcessDemo {
public static void main(String[] args) throws Exception {
//方法1:使用Runtime
Runtime runtime=Runtime.getRuntime();
runtime.exec("notepad"); //方法2:ProcessBuild
ProcessBuilder processBuilder=new ProcessBuilder("notepad");
processBuilder.start();
}
}

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

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

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

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

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

接下来讲解线程。

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

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

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

package com.StadyJava.day14Thread;

import  java.lang.Thread;

class Music extends Thread{

    public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
} public class MusicThread {
public static void main(String[] args) {
for (int i = 0; i < 50; i++) {
System.out.println("打游戏"+i);
if (i == 10) {
Music music=new Music();
music.start();
}
}
}
}

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

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

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

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

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

package com.StadyJava.day14Thread;

import  java.lang.Runnable;

class MusicRun implements Runnable{

    public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
} public class MusicRunnable {
public static void main(String[] args) {
for (int i = 0; i < 50; i++) {
System.out.println("打游戏"+i);
if (i == 10) {
Runnable music=new MusicRun();
Thread thread=new Thread(music);
thread.start();
}
}
}
}

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

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

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

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

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

package com.StadyJava.day14Thread;

import  java.lang.Runnable;

class MusicRun implements Runnable{

    public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
} public class MusicRunnable {
public static void main(String[] args) {
for (int i = 0; i < 50; i++) {
System.out.println("打游戏"+i);
if (i == 10) { //匿名内部类的形式1,使用接口
new Thread(new Runnable() { public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}).start(); //匿名内部类的形式2,使用继承类
new Thread(){
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}.start();
}
}
}
}

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

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

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

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

package com.StadyJava.day14;

class Person extends java.lang.Thread{

    private int num=50;
public Person(String name){
super(name);
} public void run() {
for (int i = 0; i < 50; i++) {
if (num >0) {
System.out.println(super.getName()+"吃了编号为"+num--+"的苹果");
} }
}
} public class EatAppleThread {
public static void main(String[] args) {
//创建3个人,去参加吃苹果大赛
new Person("许嵩").start();
new Person("林俊杰").start();
new Person("蜀云泉").start(); }
}

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

最新文章

  1. 数据结构作业——Sanji(优先队列)
  2. emacs 新手笔记(四) —— 使用 dired 完成一些简单的文件和目录操作
  3. 【bzoj3158】 千钧一发
  4. Android pulltorefresh使用
  5. 使用MSBUILD 构建时出错 error MSB3086: Task could not find &quot;sgen.exe&quot; using the SdkToolsPath的解决方法
  6. 清橙A1363. 水位 - 清华大学2012年信息学优秀高中学子夏令营
  7. sqlserver 导入/导出Excel
  8. 加密传输SSL协议2_传统加密
  9. .NET中IDisposable接口的基本使用
  10. Filter和Listener的应用——分IP统计网站访问次数
  11. 什么是spool系统,什么是预输入,什么是缓输出?
  12. linux基础命令学习笔记(二)
  13. (转)hibernateTools工具安装及使用总结(eclipse 3.6)
  14. .Net Core ----通过XUnit进行接口单元测试(带请求头及参数)并用output输出结果
  15. include和require的区别
  16. ROS零门槛学渣教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh
  17. Android大学课件SQLite3 数据库操作
  18. 10款基于jquery的web前端动画特效
  19. js模拟栈---汉诺塔
  20. ONVIF让NVR与网络监控摄像机更&quot;亲密&quot;

热门文章

  1. 【原】Java学习笔记014 - 面向对象
  2. 两种动态SQL
  3. SQLServer之视图简介
  4. const int *p;int *const p;区别及用法
  5. 进程间数据传递:Queue,Pipe 进程间数据共享:Manager
  6. javaScript判断手机型号
  7. MySQL之表相关操作
  8. day2 and day3 总结-python基础-坚持就是胜利
  9. D. Concatenated Multiples(离线处理)
  10. windows下redis安装及配置