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