本帖最后由 tianhaolin 于 2018-11-20 10:33 编辑
1.计算机基本概念
1)并发与并行
*并发:两个或多个事件在同一个时间段内发生(交替执行)
*并行:亮哥或多个事件在同一个时刻发生(同时执行)
2)进程与线程
*进程:一个应用程序在内存中的一次运行过程(一个程序可以包含多个进程)
*线程:是进程内的一个独立执行单元(一条代码执行路径)
一个程序至少有一个进程,一个进程可以包含多个线程
3)线程的调度方式
*分时调度:所有线程轮流使用CPU使用权,平均分配占用时间
*抢占式调度:优先让优先级高的线程使用CPU调度,如果优先级相同,则随机选择一个线程执行
java是抢占式调度,优先级的线程
4)主线程:执行主(main)方法的线程
2.多线程的创建
1)方式1:继承Thread类(最好使用方式2)
*定义类,继承Thread类
重写run()方法,run方法内部是线程执行的任务
创建Thread子类对象,调用start()方法起送线程
*注意事项:
同一个线程只能调用一次,多次调用会报错!
代码示例:
[JavaScript] 纯文本查看 复制代码 //创建Thread子类:
public class Person implements Runnable {
private String name;
//重写run方法,设置线程任务
@Override
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println(name + i);
}
}
public Person(String name) {
this.name = name;
}
public Person() {
}
...
}
//主程序:
//创建Thread子类对象,调用Thread类中的方法,开启新的线程,执行run方法
new Person(name).start();
2)方式2:实现Runnable接口
*Runnable runnable = new Runnable(){@Override public void run()};
Thread thread = new Thread(Runnable);
thread.start();
*实现Runnable接口接口方式,相较于继承Thread类方式的好处
**避免了单继承的局限性
**增强了程序的扩展性,降低了程序的耦合性
实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
Runnable的实现类中重写了run方法:用来设置线程任务
创建Thread子类对象,调用start方法:用来开启新线程
3.多线程的安全问题:多线程访问了共享的数据就会产生安全问题
4.同步技术
1)同步代码块
synchronizd(锁对象){}
注意:锁对象可以是任意类型的对象,必须为多个线程共享
2)同步方法
修饰符 synchronizd 返回值类型 方法名称(参数列表){}
3)Lock锁机制
Lock lock = new ReentrantLock();
l.lock();上锁
l.unlock();解锁
5.线程的状态
1)新建状态、运行状态、阻塞状态、死亡状态、冻结状态(休眠状态和永久等待状态)
"NEW 新建"
线程被创建, 但没有调用 start() 启动
"RUNNABLE 可运行"
调用 start()方法后已启动, 但可能正在执行 run() 方法的代码, 也可能正在等待CPU的调度
"BLOCKED (锁)阻塞"
线程试图获取锁, 但此时锁被其他线程持有
"WAITING 无限等待"
通过锁对象调用无参的 wait() 进入此状态.
等待其他线程通过锁对象执行 notify() 或 notifyAll() 才能结束这个状态
"TIMED_WAITING 计时等待"
如通过锁对象调用有参的 wait(long millis) 或 sleep(long millis), 则进入此状态.
直到时间结束之前被其他线程通过锁对象执行 notify()或 notifyAll()唤醒, 或时间结束自动唤醒
"TERMINATED 终止"
run()方法结束(执行结束, 或内部出现异常), 则进入此状态
|
|