文档介绍:第11讲 Java多线程
一、进程与线程
进程一般是对操作系统而言的。例如,你打开word编辑文档,同时打开outlook收取邮件。我们可以说这时系统内有两个进程在运行。即多个程序几乎在同一时间执行多个任务。
线程一般是对某一程序而言的。如上例,你打开outlook收新邮件的同时,还可以看已下载的邮件,这两件事没有相互干扰,那么我们说此时这一程序中至少有两个线程在运行。即每一个程序在同一时间内执行多个任务。
从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,但是多线程并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待。
一、进程与线程
两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。
(可以看看win2000的任务管理器)
不同进程的代码、内部数据和状态都是完全独立的,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响。
线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。
二、多线程
单线程
多线程
进程
传统进程
多线程进程
多线程的优势
减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)。
程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)。
有多个处理器的系统,可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)。
三、线程的调度
调度策略
时间片
抢占式:高优先级的线程抢占CPU
Java的调度方法
同优先级线程组成先进先出队列,使用时间片策略
对高优先级,使用优先调度的抢占式策略。
因此,java的线程调度是不分时的,同时启动多个线程
后,不能保证各个线程轮流获得均等的CPU时间片。
Java中,线程的优先级实际上无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。
线程的调度不是跨平台的,它不仅仅取决于java虚拟机,还依赖于操作系统。
1
2
四、java线程模型
虚拟的CPU,。
CPU所执行的代码,传递给Thread类对象。
CPU所处理的数据,传递给Thread类对象。
代码
数据
虚拟CPU
Java线程模型
五、主线程
在任何Java程序启动时,一个线程立刻运行(即main方法对应的线程),该线程通常称为程序的主线程。
主线程的特点:
它是产生其他子线程的线程。
它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行。
一个普通的程序,顺序执行
monTest1 {
public static void main(String args[])
{ A a1 = new A(" a1 ",1000);
A a2 = new A(" a2 ",1000);
(); ();
(2000);
}
}
class A
{ private int count ; private String sflag;
public A(){ }
public A(String sflag,int count){ = sflag; = count; }
protected int getCount() { return count; }
protected void setCount(int count) { = count; }
protected String getSflag() { return sflag; }
protected void setSflag(String sflag) { = sflag; }
public void tt()
{ for (int i = 0;i < count;i++)
{ (" A in :" + sflag + " now is :" + i); }
}
}
六、创建线程
Thread的构造器:
Thread()
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name