A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wtf518 中级黑马   /  2015-6-12 22:25  /  452 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是线程

        大家都很熟悉操作系统中的多任务:在同一刻运行多个程序的能力。

        多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序。

        多进程和多线程的区别:

        它们本质的区别在于每个进程拥有自己的一整套变量,而线程共享数据。

        在一个单独的线程中执行一个任务的简单过程:

将任务代码移到实现了Runnable接口的类的run方法中。
view sourceprint?
1
public interface Runnable {
2
    public abstract void run();
3
}


1
public class MyRunnable implements Runnable {
2

3
    @Override
4
    public void run() {
5
        // TODO Auto-generated method stub
6
        task code
7
    }
8

9
}

创建一个类对象:

Runnable r = new MyRunnable();

由Runnable创建一个Thread对象:

Thread t = new Thread(r);

启动线程:
t.start();

0
什么是线程

        大家都很熟悉操作系统中的多任务:在同一刻运行多个程序的能力。

        多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序。

        多进程和多线程的区别:

        它们本质的区别在于每个进程拥有自己的一整套变量,而线程共享数据。

        在一个单独的线程中执行一个任务的简单过程:

将任务代码移到实现了Runnable接口的类的run方法中。
1
public interface Runnable {
2
    public abstract void run();
3
}
实现一个类:


1
public class MyRunnable implements Runnable {
2

3
    @Override
4
    public void run() {
5
        // TODO Auto-generated method stub
6
        task code
7
    }
8

9
}

创建一个类对象:
1
Runnable r = new MyRunnable();

由Runnable创建一个Thread对象:
1
Thread t = new Thread(r);

启动线程:
1
t.start();

注意:

         不要调用Thread类或Runnable对象run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start方法。



中断线程

       当线程的run方法执行完毕,并执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。

       interrupt方法可以用来请求终止线程。当对一个线程调用interrupt方法时,线程的中断状态将被重置。这是每个线程都具有的boolean标志。每个线程都应该不是的检查这个值,以判断线程是否被中断。

       要想检查线程的中断状态,首先调用Thread.currentThread方法获得当前线程,然后调用isInterrupted方法:

   

1
while (!Thread.currentThread().isInterrupted()) {
2
            work code
3
        }
       但是,如果线程被阻塞,就无法检测中断状态。当在一个被阻塞的线程(调用sleep或wait)上调用interrupt方法时,就是报InterruptedException异常。



interrupted和isInterrupted的区别


       Interrupted方法是一个静态方法,它检测当前的线程是否被中断。而且,调用interrupted方法会清除该线程的中断状态。另一方面,isInterrupted方法是一个实例方法,可用来检验是否有线程被中断。调用这个方法不会改变中断状态。


InterruptedException异常处理


在catch子句中调用Thread.currentThread().interrupt()来设置中断状态,让调用者可以对它进行检查。
1
void mySubTask() {
2
        // ...
3
        try {
4
            sleep(delay);
5
        } catch (InterruptedException e) {
6
            Thread.currentThread().interrupt();
7
        }
8
        // ...
9
    }

或者,更好的方式是用throws InterruptedException,不采用try catch 语句捕获异常。让调用者捕获异常。
1
void mySubTask() throws InterruptedException{
2
        // ...
3
        sleep(delay);
4
        // ...
5
    }

线程状态

线程可以有6中状态:(获取当前状态,可调用getState方法)

New (新创建)
Runnable(可运行)
Blocked (被阻塞)
Waiting (等待)
Timed waiting (计时等待)
Terminated (被终止)

新创建线程


      当用new创建一个新线程是,如 new Thread(r),该线程还没有开始运行。这意味着它的状态是new。当一个线程处于新创建状态时,程序还没有开始运行线程中的代码。



可运行线程



         一旦调用start方法,线程处于runnable状态。一旦线程开始运行,它不必始终保持运行。事实上,运行中的线程被中断,目的是为了让其他线程获得运行机会。在任何时候,一个可运行的线程可能正在运行也可能没有运行,所以说这个状态被称作可运行而不是运行。



被阻塞线程和等待线程



         当线程处于被阻塞或等待状态时,它暂时不活动,它不运行代码并且只消耗最少的资源,直到线程调度器重新激活它。

当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。
当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。(如Thread.join 或 Object.wait)
有几个方法有一个超时参数,调用它们会导致线程进入计时等待状态。(如Thread.sleep,Thread.join,和 Object.wait 等)



被终止的线程


       线程被终止的原因:

因为run方法执行完毕,正常退出而自然死亡。
或者因为一个没有捕获的异常终止了run方法,意外死亡。
      可以调用stop方法杀死一个线程。但是,stop方法已经过时,不要在代码中调用这个方法。

评分

参与人数 2黑马币 +21 收起 理由
sk0806 + 16 赞一个!
柳叶飞刀 + 5 赞一个!

查看全部评分

11 个回复

倒序浏览
很详细的踪迹呃,受教了~
回复 使用道具 举报
好好好好。。。。。
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
貌似大神一个个都粗线了
回复 使用道具 举报
蓝菊蚊香2 来自手机 中级黑马 2015-6-12 23:24:31
地板
非常好,顶一下
回复 使用道具 举报
悦鹏 中级黑马 2015-6-12 23:46:57
7#
还没学到这啊
回复 使用道具 举报
不错,收藏了
回复 使用道具 举报
这代码格式看的好累:'(
回复 使用道具 举报
还没学到这,提前预习一下
回复 使用道具 举报
不错,受教了,加油
回复 使用道具 举报
写的很详细啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马