Java——多线程学习笔记(上)
产生多线程的方法:
(1)继承Thread类,重写run函数,调用start函数启动线程
(2)某一个类实现Runnable接口,然后该类作为参数传入一个Thread类实例,再调用该Thread类实例的start函数启动线程
注意点
一个线程只有一个开始
Thread myThread = new Thread();
myThread.start();
myThread.start();//这样会报错
同时如果直接调用线程对象的run()方法,不会产生新的线程。
yield()是当前线程释放 cpu 资源,重新与其他线程争抢,结果不一。
join() 在线程a中调用线程b的join()会使得a进入阻塞状态,等到线程b完全执行完毕后,线程a才会继续执行。
sleep()线程睡眠
isAlive()判断当前线程是否存活
线程安全问题
如三个线程卖票,会出现重票、错票等问题
原因:某一线程操作未完成时另一个线程进入操作,导致重票错票。
解决方法:当一个线程在操作过程中,其他线程无法参与(即使该线程在阻塞状态中),直到该线程操作结束,其他线程才能参与。
在JAVA中通过同步机制解决线程安全问题。
方法一:同步代码块
synchronized(同步监视器){
//需要被同步的代码
}
说明:1.操作共享数据的代码,即为需要被同步的代码
2.共享数据:多个线程共同操作的变量
3.同步监视器,俗称:锁。任何一个类的对象都可以充当锁。一般用当前对象。要求:多个线程必须要共用同一把锁。
方法二:同步方法
1.依然涉及到同步监视器,只是不需要显式声明,依然需要注意多个线程必须要共用同一把锁。。
2.非静态的同步方法,同步监视器是:this