Java 多线程相关学习总结
Java多线程学习总结
线程和进程概念
多线程三大特性:原子性,可见性,有序性
- 进程是独立的应用程序,进程中一般会有多个线程,进程是线程的集合。
- 线程就是一条执行路径。
- 多线程目的为了提高程序效率。
并发:两个队伍交替使用一台CPU
并行:两个队伍同时使用两台CPU
多线程创建方式
继承Thread类
class ThreadDemo1 extends Tread{
@Override
public run(){
while(true){
System.out.println("TreadDemo1");
}
}
}
TreadDemo1 t = new TreadDemo1();
t.start();
实现runnable接口,重写run方法
class ThreadDemo2 implements Runnable{
public void run(){
while(true){
System.out.println("ThreadDemo2");
}
}
}
Thread t = new Thread(new ThreadDemo2());
t.start();
使用匿名内部类
Thread t = new Thread(new Runnable(){
public void run(){
while(ture){
System.out.println("ThreadDemo3");
}
}
})
t.start();
多线程的状态类型
多线程大致包含五个主要状态:
新建状态:创建好线程,没有调用start方法之前。就绪状态:等待cpu分配执行权。运行状态:执行run方法代码。死亡状态:run方法执行完毕后,一个未捕获异常终止了run方法使线程猝死。阻塞状态:wait、sleep方法,锁资源被其他线程抢断等。
join()方法使用示例
join()让其他线程变为等待。把指定的线程加入当前线程,可以让两个交替执行的线程合并为顺序执行的线程。比如线程B调用了线程A的join()方法,直到线程A执行完毕后,才会执行线程B。
/**
*示例:子线程执行完毕后,主线程才能执行
*/
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "i:" + i);
}
}
});
t1.start();
// 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
t1.join();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("main" + "i:" + i);
}
线程优先级设置
在JAVA线程中,通过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5。
Thread t = new Thread(new ThreadDemo());//创建线程t
t.setPriority(10);//将线程优先级设为10
t.start();//执行线程
线程安全相关
线程安全问题产生原因
当多个线程共享同一个全局变量,在写的操作时,可能会受到其他线程的干扰。
线程安全问题解决办法
- 内置锁(Synchronized):保证线程原子性,当线程进入方法时,自动获取锁,一旦锁被其他线程获取到后,其他的线程就会等待,只有一个线程进行使用。程序执行完毕后就会把锁释放。但是它会降低程序的运行效率(锁资源的竞争)。
- 显示锁(Lock锁)
CAS
- CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
- 它是整个JUC的基础
本博客所有文章除特别声明外,大部分为学习心得,欢迎与博主联系讨论