Java进程线程笔记
什么是并行和并发?
并发和并行是即相似又有区别:(微观)
并行:指两个或多个事件在同一时刻发生; 强调的是时间点.
并发:指两个或多个事件在同一时间段内发生; 强调的是时间段.
进程和线程的区别?
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的,又称为轻型进程或进程元。 因为一个进程中的多个线程是并发运行的,那么从微观角度上考虑也是有先后顺序的,那么哪个线程执行完全取决于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 个
Java进程线程笔记的更多相关文章
- Java进程&线程(整理)
Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...
- Java进程&线程(一)
Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...
- 【Java】PS-查看Java进程-线程数
PS-查看Java进程-线程数 ps 线程 个数_百度搜索 查看进程的线程数命令 - CSDN博客 java命令行运行jar里的main类 - coderland - 博客园
- java进程/线程;堆和栈;多线程
一.进程和线程 进程:在内存中运行的应用程序,一个exe是一个进程. 如:ps -exf 可以查看各个应用的进程,其中ppid为父进程: ps aux | egrep '(cron|syslog)' ...
- JAVA 进程线程详解
线程和进程 一.进程 进程是指运行中的程序,比如我们使用QQ,就启动该进程分配内存空间. 进程是程序的一次执行过程,或是正在运行的一个程序.是一个动态的过程:有它自升的产生,存在和消亡的过程 二.线程 ...
- Java进程线程理解
一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 多线程能满足程序员编写高效率的程序 ...
- Java学习笔记-基础语法Ⅹ-进程线程
学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- Android(java)学习笔记103:Framework运行环境之 Android进程产生过程
1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...
随机推荐
- ATL右键文件菜单
自己写的小程序中用到的,网上资料相对还是毕竟全的,这里再整理下.毕竟我也不是很了解ATL,里面估计还是有不少问题的,就当作参考吧. 1.创建ATL工程,这个没什么好讲的. 我对COM组件没什么研究,这 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- maven 出现错误 -source 1.5 中不支持 diamond 运算符
mvn clean package -DskipTests 出现如下错误: -source 1.5 中不支持 diamond 运算符 [ERROR] (请使用 -source 7 或更高版本以启用 d ...
- ElasticSearch(八):elasticsearch.yml配置说明
集群名称:cluster.name: my-application确保在不同的环境中的集群的名称不重复,否则,节点可能会连接到错误的集群上 节点名称:node.name: node-1默认情况下,当节 ...
- day4-python基础-小数据池以及深浅copy浅讲
今天的目录是 1.小数据池 2.深浅copy 正文开始 1.小数据池 在说明今天的内容前,先说明一个在今天重复用到的一个知识点 ###比较’=’俩边的数据是否完全相同,以及判断一个对象的内存地址是否完 ...
- 使用Jasypt对SpringBoot配置文件加密(转)
文章转自 https://www.jianshu.com/p/323ec96c46d2 引入jasypt <dependency> <groupId>com.github. ...
- nginx与fastdfs配置详解与坑
nginx与fastdfs配置详解与坑 环境 ubantu19.04 fastdfs-5.11 fastdfs-nginx-module-1.20 libfastcommon-1.0.39 nginx ...
- nginx加密,访问接口认证
使用htpasswd加密做接口认证 首先,安装htpasswd: yum install -y httpd-tools mkdir -p /usr/local/src/nginx/ 设置用户以及密码: ...
- OSGI打安装包步骤(底包制作)
相关资源下载 equinox-SDK-LunaSR2 : https://pan.baidu.com/s/1xOzZZ3_VAuQJ3Zfp4W8Yyw 提取码: gjip gemini-web- ...
- flask(一)之路由和视图
01-介绍 Flask 是一个 Python 实现的 Web 开发微框架,同时具有很强的扩展能力. 02-第一个flask程序 # 初始化 from flask import Flask, url_f ...