线程的2中创建方式
创建线程的第一种方式:继承 Thread,由子类重写run方法
class Th1
{
public static void main(String[] args)
{
Thread1 th = new Thread1();
th.start()
}
}
class Thread1 extends Thread
{
public void run()
{
// 线程执行内容
}
}
线程状态:
新建:start()
运行:具备执行资格,同事具备执行权
冻结:sleep(time), wait() -- notify()唤醒, 线程释放了执行权,同事释放执行资格
临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权
消亡:Stop()
创建多线程的第二种方式:实现一个接口 Runable
class Th2
{
public static void main(String[] args)
{
Thread2 t = new Thread2();
Thread th = new Thread(t);
th.start();
}
}
public Thread2 implements Runnable
{
public vlid run(){
// 线程执行内容
}
}
多线程安全问题的原因:
一个线程在执行多条语句的时候,并预算同一个数据时,在执行过程中,其他线程参与进来,并操作了这个数据,导致了错误数据的产生。
解决安全问题的原理:
只要将操作的共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他西城不能执行就可以了
JAVA中提供一个解决方案方式:同步代码块
格式:
Synchroized(对象) { 对任意对象都可以,这个对象就是缩
需要同步的代码
}
wait 和 sleep 的区别:
wait 可以指定时间,也可以不指定时间。不指定时间,只能由notify或者notifyAll来唤醒
sleep:必须指定时间,时间到自动从冻结状态转成运行状态
wait : 线程会释放执行权,而且线程会释放锁
sleep:线程会释放执行权,但是不会释放锁