线程
1.线程的开启方式–三种
2.线程的状态 --五种
3.锁同步
4.线程通信
多线程:多任务同时执行就是多线程,如果没有任务,就不需要使用多线程
线程和进程之间的区别:
进程:资源分配的最小单位
线程:cpu调度的最小单位
一个进程可以包含1~n个线程
开启线程的第三种方式:
1.继承Thread类,重写run()方法
创建子类对象,调用start()方法,开启多线程
2.实现Runnable接口,重写run()方法 **
3.实现Callable接口,重写call()方法
实现Runnable方法:重写run()方法 **
开启线程: Thread类做代理,调用Thread类中的start方法开启线程
优点:
避免了单继承的局限性
实现资源共享
实现Callable接口,重写call()方法
优点:可以有返回值,可以抛出异常
缺点:使用复杂
查看线程的状态:
Thread.State getState() 返回该线程的状态。
线程优先级:
void setPriority(int newPriority) 更改线程的优先级。
int getPriority() 返回线程的优先级
1~10表示 1是最小 10是最大 默认是5
MIN_PRIORITY 最小
NORM_PRIORITY 默认
MAX_PRIORITY 最大
3.sleep、yield、join方法的区别?
Sleep()方法
Sleep()方法需要制定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行进入阻塞状态,同、高、低优先级因此都有了进入程序的机会,但sleep()方法不释放锁标识
Yield()方法
Yield()方法不会释放锁标志,与sleep()方法类似,但其无参,即yield只是使当前线程重回可执行状态,所以执行yield的线程有可能在进入到可执行状态后 马上被执行 同、高优先级线程有可执行的机会
Join()方法
package jsh.test;
public class joinMethod {
public static void main(String[] args){
Thread thread=new Thread(new JoinDemo());
thread.start();
for(int i=0;i<20;i++){
System.out.println("主线程第"+i+"次执行");
if(i>=2){
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class JoinDemo implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("线程007第"+i+"次执行");
}
}
}
package jsh.test.thread01;
/*
-
龟兔赛跑:
-
每跑十步休息一下 100毫秒
-
乌龟正常跑
-
只要有参赛者跑了100步就结束
-
课后练习:
-
场景:龟兔赛跑
-
看在相同的时间内,谁跑得更远 , 看跑的步数
-
兔子跑一步:50 毫秒的时间
-
乌龟跑一步:200毫秒的时间
*/
public class Match05 implements Runnable{
String winner=null; //存储胜利者的名字public static void main(String[] args) {
Match05 match=new Match05();
new Thread(match,“rabbit”).start();
new Thread(match,“tortoise”).start();
}@Override
public void run() {
for(int i=1;i<=100;i++){
if(“rabbit”.equals(Thread.currentThread().getName())&& i%10==0){
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+“在跑第”+i+“步”);
boolean flag=gameOver(i);
if(flag){
break;
}
}
}private boolean gameOver(int i) {
if(winner!=null){
return true;
}else{
if(i==100){
winner=Thread.currentThread().getName();
return true;
}
}
return false;
}
}
锁 块 控制线程安全
锁this就是锁对象,所对象会锁住这个对象中的所有成员(资源),如果只想锁住其中的某个资源,可以只锁这个资源
多个线程同时操作同一份资源的时候,可能会发生线程不安全问题
控制线程安全:加锁 synchronized 同步
同步方法: 在方法上面加锁
同步静态方法
同步成员方法
同步块: synchronized(){}
锁this,锁资源,锁类
锁的必须是不变的内容
锁的范围太大,效率低,锁的范围太小,容易锁不住
单例:懒汉式是线程不安全的