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

静态的同步方法,同步监视器是:当前类本身

 

同步的好处是解决了线程的安全问题。但操作同步代码时,只能有一个线程参与,其他线程只能等待,类似于单线程,效率有所下降。

posted @ 2020-08-11 15:30  阿森纳必胜  阅读(125)  评论(1编辑  收藏  举报