大数据学习路线分享线程学习笔记二,为什么要让run()方法自动开启。 cpu有随机性,线程抢到cpu,才能干活,所以run()方法必须通过strat()方法自动启动,这样cpu就获得了一个信号,知道该线程可以抢占cpu资源; 手动运行垃圾回收器 原理:当执行gc是,会触发垃圾回收机制,开启垃圾回收线程,执行finalize方法 cpu的特性:多个线程之间是抢cpu的关系,cpu有随机性 主函数结束,主任务区结束,主线程随着任务的结束而结束,线程随着任务的开始而开始 创建线程 默认情况下,主线程和垃圾回收线程都是由系统创建 ①用Thread创建线程对象 Thread thread1=new Thread(); //只是创建Thread对象 thread1.start(); //开启线程 Thread类里的run()方法默认是空的,所以start()方法执行结果 所以需要继承Thread类 重写run()方法 若run()方法直接被手动调用,run()对应的线程跟调用该方法所在的线程对应 Thread类实现了Runnable接口,Runnable接口里面只有run()方法,Thread类里实现的run()方法也只是空方法体,需要被继承去重写 创建一个A类实现Runnable接口,重写run()方法 A a=new A(); Thread to=new Thread(A); to.start(); 给某个方法的线程冲突部分加锁 锁的条件 ①锁必须是对象 ②要被所有的线程共享 同步代码块 synchronized(this){代码块} 同步函数 非静态 public synchronized void xxx(){} //默认的锁是this synchronized(this) 静态 public synchronized static void xxx(){} //默认的锁是当前类的字节码文件 synchronized(xx.class) notify(终止线程休眠) wait(线程休眠,不可以抢占cpu) wait()-->必须在同步环境中使用,必须使用锁调用,执行这行代码,对应的是哪个线程,就 notify()-->唤醒的是同一把锁下的线程, Lock(显示同步) 替换 Synchronized(隐式同步) //创建锁对象 Lock lock=new ReentrantLock(); //用于生产任务的Condition Condition proCon = lock.newCondition(); //用于结束任务的condition Condition conCon = lock.newCondition(); //开启锁 lock.lock(); proCon.await(); conCon.signal(); conCon.await(); proCon.signal(); //关闭锁 lock.unlock(); 守护线程 当程序调用setDaemon方法时,并且将参数设置成true,当前线程就变成了了守护线程,只要主线程结束,该守护线程就会结束,这个方法一定要在start前调用 join()方法,优先级高于主线程,主线程会等当前的线程执行完后再去执行;该方法是在start之后。 |
|