文档章节

20170310_java的进程与线程

jj_fly
 jj_fly
发布于 2017/03/10 22:25
字数 1530
阅读 1
收藏 0

进程与线程

 

引出:Dos系统中病毒死机——单进程

Windows多进程的处理方式,比如启动一个软件会在操作系统上分配一个进程。

 

进程和线程的关系,就是说,线城市进程的进一步划分,比如Word的拼写检查,在Word的进程中进行。如果一个线程没有了,拥有它的进程没有影响,而进程小时线程必定消失。

 

原本传统的进程任务是。一个程序独占所有属于该进程的文件、系统资源、IO装置,在多线程的进程中,多个线程程序在原本的程序位置运行,势必导致所有的线程共用一个资源(这里涉及到一定的安全性问题,后续研究。)

 

进程的系统资源是共享的,但是,程序处理需要CPU。对传统单核cup在同一个时间段。会有多个程序运行,但是一个时间点只有一个,所有程序要抢占CPU资源。

现在的多核CPU,此时可以清楚看见多线程是如何并发执行。

 

Java的多线程实现

 

两种方式:(java.lang 包下定义,lang包实实际运行中自动导入无需手工编写import语句)

A继承Tread类

B继承Runnable接口

一个类只要继承了Thread类,此类就称为多进程实现类,子类必须复写run方法。此方法是线程主体。
 

Class myThread extends Thread{

Private String name ;

Public myThread(String name){

This.name = name;

}

Public void run(){

For(int i = 1;i<100;i++){

System.out.println(name+”运行,i=”+i);

}


}

}


Public class ThreadDemo{

Public static void main(String[] args){

MyThread m1 = new mythread(“fghjk”);

MyThread m2 = new mythread(“fghjkvbnn”);

M1.run;

M2.run;

}

}

 

此时发现,县城其实并没有交错运行,说明此时线程并没有启动(线程的运 行需要本机底层操作系统的支持,start定义含有native关键词表示调用本 机的操作系统函数,重复调用start会抛出异常),如何启动?、

 

将上方的run都改成start(start中会调用run方法)

 

结果是随机的,哪个线程抢占了资源就能运行。

 

实现runnable接口

Class mythread implements runnable{

Private String name ;

Public myThread(String name){

This.name = name;

}

Public void run(){

For(int i = 1;i<100;i++){

System.out.println(name+”运行,i=”+i);

}


}

}//此时,runnable没有start来启动线程,还是依靠Thread



Public Class runnabledemo{


Public static void main(String[] args){


Mythread m1 = new mythread(_);

Mythread m2 = new mythread();


Thread t1 = new thread(m1);

Thread t2 = new thread(m2);

t1.run();

t2.run();


}

在Java中也可以通过实现runnable接口方式进行多线程实现。


 

Thread类和runnable接口都可以实现多线程,那么有什么分别?

 

Thread类也是runnable接口的子类,但在类中没有完全实现run’方法,仅仅调用了runnable中的方法,所以必须复写run方法。

使用上差别:继承了Thread的类不适合多个线程共享资源,而实现了runnable的类则可以方便的实现资源共享。

 

举例

public ststic viod main(String[] args){

Mytread m1 = new mythread();

Mythread m2 = new mythread();

M1.run();

M2.run();//m1.m2资源独立


}


public static void main(String[] args(){

mythread m = new mythread();

thread t1 = new thread(m);

thread t2 = new thread(m);

t1.run();

t2.run();//使用同一个资源m

}

 

故此runnable相对于Thread而言,有如下显著优势:

 

   适合多个相同程序代码的线程去处理同一个资源的情况;

   可以避免由于Java单继承特性带来的局限‘’

   增强了程序的健壮性,代码能被多个线程共享,代码与数据是独立的

线程的状态

 

要想实现多线程,必须在主线程中实现建立新的线程的对象。任何线程具有5种状态:创建、就绪(start)、运行(start后自动调动run或者阻塞后手动进行run)、阻塞(sleep、suspend、wait)、终止(stop,或者run结束后的死亡状态,即使有资源不能运行)

 

操作线程的主要方法不在runnable中,而是在Thread里,eg:

 

currentThread表示返回当前执行的线程

getname返回线程的名字(在不起名时系统会自动设置一个名字在Thread类中有一个static的函数起名)

getpriority返回线程的优先级

isinterrupted判断线程是否被中断

isalive判断是否在活动

join throws interrupted exception 等待线程死亡

join (10000)throws interrupted exception等待毫秒后死亡

setname

setpriority设置优先级

sleep(10000)throws interrupted exception目前执行的线程休眠10000毫秒

tostring 返回代表县城的字符串

yield 将目前正在执行的线程暂停,允许其他线程运行

了解到一些方法比如suspend和resum以及过时,因为有死锁倾向

 

Runnable使用事例

 

 

再次调用run时。

 

 

 

待解决疑问:public static void main也是 一个线程,但是不调用run,main就不打印,调用了就打印???

 

梳理题:

1对Java程序来说,程序每次运行至少启动多少个线程?

答:2个,每当Java执行一个类时实际上会启动一个jvm,而一个jvm实际上就是在操作系统中产生一个进程,而main也是1个所以至少2,在Java中所有的线程是同时启动的谁先抢到资源谁先。

 

2为什么Thread不直接调用run()方法,而是通过start()调用呢。

jdk的Thread里面的start 和run方法是这么定义的

start

public void start()

使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。

多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

 

run

public void run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

Thread 的子类应该重写该方法。

 

© 著作权归作者所有

jj_fly
粉丝 0
博文 4
码字总数 7081
作品 0
长春
私信 提问
【Java每日一题】20170310

20170309问题解析请点击今日问题下方的“【Java每日一题】20170310”查看(问题解析在公众号首发,公众号ID:weknow619) 今日问题: 请问主程序运行结果是什么?(点击以下“【Java每日一题...

weknow
2017/03/10
0
0
【Java每日一题】20170313

20170310问题解析请点击今日问题下方的“【Java每日一题】20170313”查看(问题解析在公众号首发,公众号ID:weknow619) 今日问题: 请问主程序运行结果是什么?(点击以下“【Java每日一题...

weknow
2017/03/13
0
0
Java 对象锁-synchronized()与线程的状态与生命周期与守护进程

synchronized(someObject){ //对象锁} 一、对象锁 someObject 的使用说明: 1、对象锁的返还。 当synchronize()语句执行完成。 当synchronize()语句执行出现异常。 当线程调用了wait()方法。...

Oscarfff
2015/05/04
0
0
java核心技术-多线程之线程基础

说起线程,无法免俗首先要弄清楚的三个概念就是:进程、线程、协程。OK,那什么是进程,什么是线程,哪协程又是啥东西。进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,...

xgoing
2018/08/19
0
0
Linux ---> 监控JVM工具

JDK内置工具使用 jps(Java Virtual Machine Process Status Tool) 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 jstack(Java Stack Trace) ① 观察jvm中当前所有线程的运行情况和线...

shking
2013/10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

texlive安装

Installing to: D:/bin/texlive/texlive/2019Installing [001/307, time/total: ??:??/??:??]: adobemapping [2130k]Installing [002/307, time/total: 00:03/08:57]: ae [84k]Installing......

MtrS
48分钟前
2
0
运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部