多线程编辑:
可以简单理解进程是一个软件 而线程就是一个软件中多个可以同时运行的功能
实现多线程的第一种方式:使用Thead类我们再自己创造一个类继承于这个类我们在对Thead方法进行重写,注意我们再重写的时候一定要加上@Override这行
我犯下的错误2:
我们在类里面调用方法的时候我们是不需要加上对象的名字,当我们在想要使用多线程的时候我们要用对象名.start() 这个时候才能实现多线程
多线程的第二种实现方式:实现Runnable接口的方式进行实现
具体代码如上
实现多线程的第3种方式:
着种方式可以获得多线程的结果
实现多线程的步骤:第一创建任务 第二分配任务 第三讲任务交给多线程 第四启动多线程
Thread类的成员方法
继承的复习:当我们想要在子类进行构造方法我们可以先用super继承父类 ,然后我们在后面我们创建的线程取名字。
在多线程中如果我们使用的是接口的话,我们就需要创建任务,然后再将任务放到多线程中
如果我们使用的是extends 继承Thread类的话,我们就可以直接使用多线程
延时
Thread.sleep(毫秒) 这个其实就是和easyx库里面的sleep函数是一个意思,由于这个Thread.sleep是静态方法我们直接类名加上方法名使用。
设置线程优先级
对象名.setPriority()这个是给我们设置优先级的,最高优先级是10,最低优先级是1,这个优先级只是代表了一个概率的问题
守护线程(备胎线程)
具体代码如上:
效果就是作为备胎当它要保护的对象已经执行完了,那么这个备胎对象就没有执行下去的必要了,那么就会自动停止,注意这个不是马上就会停止,而是会等一段时间才会停下来
线程的生命周期
线程安全:由于多线程具有随机性,当一条语句还没有完全执行完有可能就会被另外一条语句所占有,这个时候就会造成错误,就好比我们和好朋友再上厕所,只有厕所有门的时候才能单独上厕所,如果厕所没有门,那么本来该单人厕所就会被两个人占有,就会出问题。
所以这个时候我们呢就需要一种操作’锁’:synchronized
我犯下的错误:
这个延时应该放在锁的外面
package duoxianchenanquan;
public class Mythread extends Thread{
static int ticket = 0;
@Override
public void run(){
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (Mythread.class){
if(ticket < 100){
ticket++;
System.out.println(getName() + "正在卖第" + ticket + "张票! ! !");
}
else {
break;
}
}
}
}
}
当我们需要对一个方法进行 就是一个同步方法
顺便复习一下this的使用方法:他的这个对象就是调用这个方法的对象
小技巧:ctrl + alt + m这个就可以使我们选择的一段代码直接转化为一个方法。
Lock锁
为了避免死锁我们就不能写一个锁嵌套的结构
生产消费机制