java进程线程_Java进程线程笔记
什么是并行和并发?
并发和并行是即相似又有区别:(微观)
并行:指两个或多个事件在同一时刻发生; 强调的是时间点.
并发:指两个或多个事件在同一时间段内发生; 强调的是时间段.
进程和线程的区别?
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的,又称为轻型进程或进程元。 因为一个进程中的多个线程是并发运行的,那么从微观角度上考虑也是有先后顺序的,那么哪个线程执行完全取决于CPU调度器,程序员是控制不了的。我们可以把多线程并发性看作是多个线程在瞬间抢CPU资源,谁抢到资源谁就运行,这也造就了多线程的随机性。
怎么创建进程?
创建进程的方式有两种,我以windows上的记事本为例:
packagecom.StadyJava.day14;importjava.io.IOException;public classProcessDemo {public static void main(String[] args) throwsException {//方法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类
packagecom.StadyJava.day14Thread;importjava.lang.Thread;class Music extendsThread{public voidrun() {for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}public classMusicThread {public static voidmain(String[] args) {for (int i = 0; i < 50; i++) {
System.out.println("打游戏"+i);if (i == 10) {
Music music=newMusic();
music.start();
}
}
}
}
注意,继承了Thread类之后要重写run方法,而且在调用的时候,只能使用start方法,不能调用run方法,切记!
输出的结果是在打游戏10之后,下面的打游戏和听音乐都是随机出现,因为主线程main和线程music在抢占资源,谁抢到谁执行,所以输出的结果是随机的
(注意!我使用Idea输出的结果是顺序的,不是随机的。我同学和我一样的代码使用Eclipse结果是随机的,我自己复制到Eclipse之后偶尔随机,Idea是死都不随机,这个我解决不了,希望以后知道原因或者有人告诉我)
创建线程的方法2:实现Runnable接口
其实Thread类也是实现了Runnable接口的,所以这个方法我感觉是本源??
packagecom.StadyJava.day14Thread;importjava.lang.Runnable;class MusicRun implementsRunnable{public voidrun() {for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}public classMusicRunnable {public static voidmain(String[] args) {for (int i = 0; i < 50; i++) {
System.out.println("打游戏"+i);if (i == 10) {
Runnable music=newMusicRun();
Thread thread=newThread(music);
thread.start();
}
}
}
}
没什么特别的,就是生成一个runnable的对象,然后Thread对象加载进这个Runnable对象,最后start方法调用一下就完事了。这个结果我的Idea依然是显示的不符合我的期望的。
上面两种创建线程的方式是最常用的方式,一般也就足够了,下面介绍一下不怎么常用的
创建线程的方法3:匿名内部类创建线程
匿名内部类的格式:new 接口(){} 应该是这样的,待补充
其实匿名内部类创建线程还是使用上面的两种方式,只不过那个Music类我不需要去定义了,这就是匿名内部类,看代码吧
packagecom.StadyJava.day14Thread;importjava.lang.Runnable;class MusicRun implementsRunnable{public voidrun() {for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}public classMusicRunnable {public static voidmain(String[] args) {for (int i = 0; i < 50; i++) {
System.out.println("打游戏"+i);if (i == 10) {//匿名内部类的形式1,使用接口
new Thread(newRunnable() {public voidrun() {for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}).start();//匿名内部类的形式2,使用继承类
newThread(){public voidrun() {for (int i = 0; i < 50; i++) {
System.out.println("听音乐"+i);
}
}
}.start();
}
}
}
}
这回,输出的结果总算是符合我的预期了,可能是线程变成了3个,抢占资源激烈了些。。。
学了两种常见的创建线程的方法之后,他们之间有什么区别呢?
Thread创建线程和Runnable创建线程的区别
我写个例子,吃苹果大赛,3个人参加比赛,先使用继承Thread类创建线程的方式,代码如下:
packagecom.StadyJava.day14;class Person extendsjava.lang.Thread{private int num=50;publicPerson(String name){super(name);
}public voidrun() {for (int i = 0; i < 50; i++) {if (num >0) {
System.out.println(super.getName()+"吃了编号为"+num--+"的苹果");
}
}
}
}public classEatAppleThread {public static voidmain(String[] args) {//创建3个人,去参加吃苹果大赛
new Person("许嵩").start();new Person("林俊杰").start();new Person("蜀云泉").start();
}
}
这个输出的结果,就是许嵩,林俊杰,蜀云泉每个人都吃了50 个
java进程线程_Java进程线程笔记相关推荐
- java 进程描述_java 进程和线程
什么是进程,什么是线程? 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位. 线程:是进程的一个执行单元,是进程内科调度实体.比进程更小的独立运 ...
- java的进程和线程_java进程和线程区别与不同
java进程和线程区别与不同. 一.定义 1.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位. 2.线程是进程的一个实体,是CPU调度和分派的基本 ...
- mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查
一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多.  二.定位故障 根据这 ...
- java 事务管理 子父线程_java父线程子线程(转)
问:在父线程中New了一个子线程,想在停止父线程时也停止子线程,应该怎么做? 答: 从某种程度上讲,做不到. 不管是父线程还是子线程,这只不过是在运行时谁建了谁时用的,一旦所谓的字线程被启动,这两个线 ...
- java 线程组和线程_Java多线程 线程组原理及实例详解
线程组 线程组可以批量管理线程和线程组对象. 一级关联 例子如下,建立一级关联. public class MyThread43 implements Runnable{ public void ru ...
- java 线程中创建线程_java – 在线程中创建线程 – 良好的做法?
参见英文答案 > Threads within threads in Java? 4个 在线程中启动线程是一种好习惯吗?我搜 ...
- java中断线程_Java中断线程的方法
使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...
- java阻塞超时_JAVA防线程阻塞(超时控制)
2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...
- java自定义线程_Java自定义线程池详解
自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...
最新文章
- Android手机指令操作释疑
- 随机森林OOB score作用
- 吴恩达深度学习(53)-Batch Norm 为什么奏效?
- 励志前行,加速BCH创新落地
- php集成环境wamp搭建后,如何配置服务器
- 正则表达式(overall)
- 精选30道Java笔试题解答
- 搞定高并发,岂能不懂Synchronized底层原理?
- 大剑无锋之已知后续遍历bfegcda,中序badefcg,前序是?【面试推荐】
- 你应该知道的jQuery技巧【收藏】
- c语言实现灰度图像阈值分割,灰度图像--图像分割 阈值处理之平均阈值
- 除了 Docker,我们还有哪些选择?
- 02在Windows Server 2008R2上面将客户端加入域
- 从1.5K到18K 一个程序员的5年成长之路
- 暴风影音 去广告 方法
- Excel导出(浏览器下载器下载导出Excel)
- AOC 27G3Z 评测
- 阿里云备案流程、操作步骤及所需时间图文详解
- 微信小程序-名片复制功能效果
- AliOS Developer 网址