1 - 线程
- 简单理解,线程就是进程中一条执行路线 ,一个单一的控制执行流程。
- 比如一个进程是"读取后台数据同时渲染到用户界面反馈给用户",因为读取用户数据时间长,所以单开一个线程单独处理此事,另有一个渲染页面线程
- 和进程一样,每个线程都有独立的控制流程,由操作系统调用
- 不同的地方时,同一个进程的各个线程之间是共享存储空间。这样做,好处是方便通信,缺点是不利于同步
- 一个进程可以拥有多个线程
- 多线程的优点
- 更好的实现并行,提高复杂应用性能
- cpu在线程之间切换,比在进程之间切换,开销小很多、
- 创建和撤销线程,开销也很小
2 - 多线程实现
-
在http服务器中,比如tomcat、jboss 中,服务器已经帮我们实现了多线程,每一个请求都是多线程的
-
学习阶段,在Java API中实现多线程, 在这里下载了api中文文档 (mac 环境下,需单独下载chm 阅读)
-
上图中,可以清晰看到 Java中 thread 特点
- 每个线程都有优先级,高的先执行,当一些线程中运行代码创建一个新的Thread时,新线程的优先级最初设置为等于创建线程的优先级
- 只有守护进程才可创建守护线程
-
线程退出
- 该
exit
类的方法Runtime
已经被调用并且安全管理器允许退出操作发生。 - 不是守护进程线程的所有线程都已经死亡,无论是从调用返回到
run
方法还是抛出异常,传播超出了run
方
- 该
-
创建线程的方法
-
将一个类声明为一个
Thread
的子类,重写run
类的方法,启动线程并运行// 定义 class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } // 启动 ,main方法类 class Test{ public static void main(String[] args){ PrimeThread p = new PrimeThread(143); p.start(); } }
-
声明一个实现
Runnable
接口的类// 定义 class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } // 启动 ,main方法类 class Test{ public static void main(String[] args){ PrimeRun p = new PrimeRun(143); new Thread(p).start(); // 注意 实现runnable的类,需要作为传参传入thread类中,调用start启动 } }
-
-
Thread类构造函数
Constructor 描述 Thread()
分配一个新的 Thread
对象。Thread(Runnable target)
分配一个新的 Thread
对象。Thread(ThreadGroup group, Runnable target)
分配一个新的 Thread
对象。 -
Thread 类常用方法 : 静态方法
interrupted()
测试当前线程是否已中断。 该方法可以清除线程的*中断状态- isInterrupted() 不会修改线程的中断状态
sleep()
: 使当前正在执行的线程停留(暂停执行)指定的毫秒数,这取决于系统定时器和调度程序的精度和准确性yield()
:对调度程序的一个暗示 , 启发式尝试,调度程序可以自由地忽略这个提示,很少用这种方法
-
Thread类 常用方法 : 普通方法
- run() : 实现Thread的类,需要重写此方法
- getId()、 getState()、 getName()、getPriority() : 获取线程的一些信息
- join() :等待这个线程死亡
- interrupt() : 中断这个线程
- setDaemon() : 设置成后台线程
-
注意 : 线程 Thread类中,很多不推荐使用方法
- 比如 stop() , 线程不能主动停止
3 - 线程优先级
-
JDK中修改线程优先级 :
public static final int MIN_PRIORITY public static final int NORM_PRIORITY public static final int MAX_PRIORITY public final void setPriority(int newPriority)
-
修改了线程优先级后,优先级高的线程有机会先执行
class TestPriority implements Runnable{ private int priority; private volatile double a; TestPriority(int priority){this.priority = priority} public void run(){ Thread.currentThread.setPriority(priority); // 设置优先级 for(i=1 to 1000000){ a +=(Math.Pi+Math.E); if(i % 1000 == 0) Thread.yield(); // 每1000个数就交出控制权 } println(Thread.currentThread.getName()+"*"+Thread.currentThread.getPriority()); } main(){ for (int i = 0; i < 5; i++) { new Thread(new SimplePriority(Thread.MIN_PRIORITY)).start(); new Thread(new SimplePriority(Thread.MAX_PRIORITY)).start(); } } }