概念:

  操作系统可以有多个进程,一个线程可以有一个或多个线程。进程与进程之间不共享内存,都在各自的空间中运行。而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈。

  线程又称轻量级进程。Java的线程是靠CPU时间片的快速切换实现的,并不是真正的同时进行。每个线程有独立的线程栈和程序计数器。线程在自己的栈中存储变量,使数据互不干扰,对于共同资源,容易引发并发问题,需要同步处理。

 

创建线程常用的两种方式:

  1、继承Thread类,重写run()

  2、实现Runnable接口

 

线程生命周期:创建--就绪--运行--阻塞--死亡

note:

  1、线程的调度基于时间片基础上的优先级优先原则,注意即使setPriority()也不一定完全按照顺序执行

  2、线程进入Runnable(可运行状态,就绪状态),并不意味着它立即执行。

 

jion:调用其它线程。当前线程调用其它线程的jion()方法,使自己进入中断状态,必须等待调用的线程执行完,才能进入就绪状态(并不立即运行)。

code:

public class Test {

    public static void main(String[] args) {
        MyThread m = new MyThread();
        Thread t = new Thread(m);
        t.start();
        int i=0;
        while(i++<100){
            if(i==50){
                try {
                    t.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("main:"+i);
        }
    }
}
class MyThread implements Runnable{
    int i=0;
    public void run() {
        while(i++<50){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("my thread: "+i);
        }
    }
    
}

yield: 暂停当前线程,yield() 为静态方法,功能是暂停当前正在执行的线程对象,并执行其他线程。当前线程变为就绪状态,也就是说某线程调用yield()方法后可能还运行此线程(表现为未暂停)(仅个人看法,尚未看到哪里有对此的说明,可能存在误解)。

code:

public class Test { 
    
    public static void main(String[] args) { 
        Thread t1 = new MyThread(); 
        t1.start(); 
        for(int i=0; i<100; i++){
            System.out.println(i);
        }
    } 
} 
class MyThread extends Thread { 
    public void run() { 
        for (int i = 0; i < 100; i++) { 
            System.out.println("MyThread"+i ); 
            Thread.yield();
        } 
    } 
} 

interrupt: 中断线程。将会设置该线程为中断状态,即设置为true。线程会不时地检测这个中断标识位,以判断线程是否应该被中断。线程可以调用另外一个线程的interrupt方法,这将向暂停的线程发出一个InterruptedException

isinterrupted判断线程是否中断,不会清除中断状态

interruped返回线程上次的中断状态,并清除中断标志位,即重新设置为false

 

结束线程方式:

 

1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

 

2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

 

3.  使用interrupt方法中断线程。(中断不会结束线程,但可以利用异常处理是线程结束)

 

哪些操作可以使线程进入阻塞状态?

  Jion()、yield 、wait() 、sleep()、I/O

 

 posted on 2014-08-25 19:24  平和之心  阅读(323)  评论(0编辑  收藏  举报