停止线程
-----------
1、定义循环结束标记
.因为线程运行代码一般都是循环,只要控制了循环即可
2、使用interrupt(中断)方法
.该方法是结束线程的冻结状态,使线程回到运行状态中来
注:stop方法已经过时不再使用
创建线程方式
--------------------
1、Thread
2、Runnable{public void run();}
例子:class Man extends Person implements Runnable{ //Man虽然具备有执行功能了,但它不是线程必须newThread这个参数可以传递一个Runnable接口的对象 ———》》new Thread(new Man()).start();如果运行的话还得托付Thread函数
public void run(){
.................
}
}
new Car().start();
new Thread(new Man()).start();
sleep和监控权没有任何的关系
------------------------------------
创建线程方式二
-----------------
实现Runnable接口
1、子类覆盖安接口中的run方法
2、通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread
类的构造函数
3、Thread类对象调用start方法开启线程
思考:为什么要给Thread类的构造函数传递Runnable的子类对象?
答:用一个存在的类具备线程的功效,就不继承Thread了,只能通过其他的手段加以实现。只能实现一个Runnable接口
重写方法后才能调用父类的方法即:new一个对象后才行
-------------------------------------------------
线程安全问题
-----------
导致安全问题的出现的原因:
1、多个线程访问出现延时
2、线程随机性
注意:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的
-------------
同步(synchronized)
格式:
synchronized(对象){
需要同步的代码
}
同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁定的功
同步的特点:
-------------
同步的前提:
1、同步需要两个或者两个以上的线程
2、多个线程使用的是同一个锁
未瞒足这两个条件,不能称其为同步
同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
线程间通信
——————-
思考:wait(),notify(),notifyAll(),用来操作线程为什么定义在object类中?
答:1、这些方法存在与同步中。2、使用这些方法时必须要标识所属的同步的锁。3、锁可以是任意对象
所以任意对象调用的方法一定定义object类中。
思考2:wait(),sleep()有什么区别?
wait():释放cpu执行权,释放锁
sleep():释放cpu执行权,不释放锁
yield():等待指定的线程执行完后继续执行
notify通知去权
并发是同时执行————要考虑到线程的安全性
线程的其他方法 优先级
---------------
1、setPriority(int num)---》》优先级
2、setDaemon(booleanb)———》》守护线程 ———》如果一个程序中都是守护线程的话就会结束了
3、join()--》当子线程运行后再运行主线程,也就是使它们有序进行
4、自定义线程名称
5、toString ———》是toString方法