Java——线程
【进程】
<1>进程是一个静态的概念(代码加载到内存的代码区,这就表示一个进程).
<2>线程是一个进程里不同的执行路径,机器上运行的都是线程。
<3>对于单个CPU而言,在同一个时间点上,CPU只支持一个线程运行。真正的多线程是双CPU或双核。
【进程与线程】
<1>每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
<2>线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的
的开销较小。
<3>多进程在操作系统中能同时运行多个任务(程序)。
<4>多线程在同一应用程序中有多个顺序流同时执行。
【说明】
<1>Java的线程是通过java.lang.Thread类实现的。
<2>VM启动时会有一个由主方法(public static void main(){})定义的线程。
<3>可以通过创建新的Thread实例创建新的线程(在实现对应接口的前提之下)。
<4>每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。
<5>通过调用Thread类的start方法来启动一个线程。
【线程的创建和启动】
注:<1>在main方法继续执行的情况下,运行线程(这两个是交替运行或者说是并列运行)。
<2>这两种方法推荐使用接口实现的方法,因为使用继承之后不能再实现别的类(Java不支持多继承),而实现一个接口之
后还能继承类或实现别的接口,这样便于实际中的应用(只要能使用接口就不要使用类继承)。
【线程状态转换】
注:<1>调用start()方法时不一定就执行该线程,而是处于就绪状态。
<2>调入到CPU后才处于运行状态。
【线程常用方法】
注:<1>new出来之后还未start,这时是“死的”;就绪状态、运行状态、阻塞状态都是“活的”。
【sleep/join/yield方法】
----sleep方法
<1>可以调用Thread的静态方法:
public static void sleep(long mills)throws InterruptedException
//使得当前线程休眠(暂时停止mills毫秒)
//一定会抛出异常(处于睡眠状态被唤醒时就是一个异常)
【程序】
public static void main(String[] args){
MyThread thread = new MyThread();
thread.start();
try { Thread.sleep(1000); }
catch(InterruptedException e){}
thread.interrupt();
//关闭线程(这种关闭方式不推荐,更不推荐使用stop,Windows进程杀死就是使用的该方法)
}
class MyThread extends Thread{
public void run(){
while(true){
System.out.println(new Date());
try{
sleep(1000);
}catch(InterruptedException e){
return;
}
}
}
注意:这里不能在run方法上抛出异常,因为run是重写的方法,重写的方法不能抛出与被重写方法不一样的异常,这里只能
用try-catch语句。
<2>由于是静态方法,sleep可以由类名直接调用:
Thread.sleep();
----join方法
合并多个线程(相当于方法调用,不再是原来多线程中的同步运行)
----yield方法
让出CPU,给其他线程执行的机会。
【线程的优先级】
<1>Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。
线程调度器按照线程的优先级决定应调度哪个线程来执行。
<2>线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5.
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
<3>使用下面的方法获得或设置线程对象的优先级:
int getPriority();
void setPriority(int newPriority);
【线程同步】