Java多线程——Thread
来源:互联网 发布:淘宝联盟买家 编辑:程序博客网 时间:2024/05/17 02:28
今天工作上用到了一些线程方面的知识,有些知识点学了不用一段时间后就会被忘记的,所以下来后觉得还是应该总结一下基础知识,方面以后回顾。
什么是线程
大家都很熟悉操作系统中的多任务:在同一刻运行多个程序的能力。
多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序。
多进程和多线程的区别:
它们本质的区别在于每个进程拥有自己的一整套变量,而线程共享数据。
在一个单独的线程中执行一个任务的简单过程:
- 将任务代码移到实现了Runnable接口的类的run方法中。
public interface Runnable { public abstract void run();}
实现一个类:
public class MyRunnable implements Runnable { @Override public void run() { // TODO Auto-generated method stub task code }}
- 创建一个类对象:
Runnable r = new MyRunnable();
- 由Runnable创建一个Thread对象:
Thread t = new Thread(r);
- 启动线程:
t.start();
注意:
不要调用Thread类或Runnable对象run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start方法。
中断线程
interrupt方法可以用来请求终止线程。当对一个线程调用interrupt方法时,线程的中断状态将被重置。这是每个线程都具有的boolean标志。每个线程都应该不是的检查这个值,以判断线程是否被中断。
要想检查线程的中断状态,首先调用Thread.currentThread方法获得当前线程,然后调用isInterrupted方法:
while (!Thread.currentThread().isInterrupted()) { work code }
但是,如果线程被阻塞,就无法检测中断状态。当在一个被阻塞的线程(调用sleep或wait)上调用interrupt方法时,就是报InterruptedException异常。
interrupted和isInterrupted的区别
Interrupted方法是一个静态方法,它检测当前的线程是否被中断。而且,调用interrupted方法会清除该线程的中断状态。另一方面,isInterrupted方法是一个实例方法,可用来检验是否有线程被中断。调用这个方法不会改变中断状态。
InterruptedException异常处理
- 在catch子句中调用Thread.currentThread().interrupt()来设置中断状态,让调用者可以对它进行检查。
void mySubTask() { // ... try { sleep(delay); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // ... }
- 或者,更好的方式是用throws InterruptedException,不采用try catch 语句捕获异常。让调用者捕获异常。
void mySubTask() throws InterruptedException{ // ... sleep(delay); // ... }
线程状态
线程可以有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方法,意外死亡。
- Java多线程——Thread
- JAVA——多线程Thread
- java—多线程编程 Thread
- java多线程—Thread.Join()和Thread.Sleep()
- Java——Thread/Runnable实现多线程
- Java多线程——Thread 和 Runnable
- 【多线程】JAVA——Thread类实现
- java多线程—Runnable、Thread、Callable
- java多线程—Runnable、Thread、Callable区别
- Java多线程—Thread类常用方法
- Java多线程—创建Thread类实现多线程
- Javase—Thread多线程
- JAVA初入门——Socket,Thread,多线程Socket
- Java 多线程——Thread类和Runable接口
- JAVA初入门——Socket,Thread,多线程Socket
- Java 多线程——Thread类和Runable接口
- Java多线程学习(二)——Thread Safety
- java多线程总结笔记1——Runnable和Thread
- android studio Gradle如果不能找依赖的包(Gradle can't find dependency (Android support library)),教你如何解决
- IOS制作一个漂亮的登录界面
- EditText set cursor 位置 Demo
- GNU c __attribute__详解
- Java基础:网络+socket
- Java多线程——Thread
- C编译器剖析_1.5 结合C语言来学汇编_指针、数组和结构体
- 主题:jQuery必知必熟基础知识
- 纸牌游戏 比较大小
- Leetcode_121_Best Time to Buy and Sell Stock
- “不完全类型”指在C++中有声明但又没有定义的类型
- android notification 自定义声音
- 转身不带走一丝云彩--我的2014
- 如何在PictureBox上透明的显示文字