谈一谈java线程
什么是线程?
- 一个线程是一个程序单个的连续控制;
- 一个软件能处理一系列的线程构造;
- 线程能同时运行,彼此独立; cpu 3000000000/s
- 包为java.lang.Thread;
线程或上下文的构成
- 一个虚拟处理机;
- CPU执行的代码可以或不可以由多个线程共享,这和数据是独立的。两个线程如果执行同一个类的实例代码,则它们可以共享相同的代码。
- 代码操作的数据可以或不可以由多个线程共享,这和代码是独立的。两个线程如果共享对一个公共对象的存取,则它们可以共享相同的数据。
线程机制
- 当线程开始,run()方法里代码被执行;
- 创建线程的二种方法:
a. 继承Thread类;
b. 实现Runnable接口。
通过继承Thread类创建一个线程
- 定义
public class MyThread extends Thread{
public void run(){...}
}
- 初始化
MyThread testThread = new MyThread()
通过实现runnable接口创建一个线程
- 定义
public class MyRunnable implements Runnable {
public void run(){...}
}
- 初始化
MyRunnable testRunnable = new MyRunnable();
Thread testThread = new Thread(testRunnable)
二种创建线程方法的比较
- 继承Thread类是面向对象编程;
- 实现Runnable接口解决了单继承
线程调度
- 线程是抢占式的,但并不一定是分时的;
- 有多个线程可运行,但只有一个线程在实际运行。
- 所有可运行线程根据优先级保存在池中,当一个被阻塞的线程变成可运行时,它会被放入相应的可运行池,优先级最高的非空池中的线程得到处理机时间。
- sleep()调用会给较低优先级线程一个运行的机会,yield()方法只会给相同优先级线程一个执行的机会。
线程的基本控制
- 启动线程:使用start()方法,这意味着线程可以由JVM调度并执行,并不意味着线程就会立即执行。
- 终止一个线程:当一个线程结束运行并终止时,它就不能再运行了。
- 测试一个线程:isAlive()方法用来确定一个线程是否仍是活的。活着的线程并不意味着线程正在运行。
- 延迟线程:
sleep():使线程停止一段时间,间隔期满后,线程不一定立即恢复执行。
join():挂起当前线程,直至它所调用的线程终止。
synchronized关键字
- 标识一组变量应该被一个线程独占地使用;
public void push(char c){
synchronized(this){
...
}
}
public synchronized void push(char c) {
...
}
说明:所有对易碎数据的存取应当是同步的,由synchronized保护的易碎数据应当是private的。
线程交互
- wait():交出锁和CPU的占用;
- notify():将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。
- notifyAll(): 将从等待池中移走所有等待那个对象的线程并放到锁池中,只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行。