首页 > 编程语言 > 详细

线程的四种实现方式,一些方法及线程的同步

时间:2019-03-21 11:48:00      阅读:128      评论:0      收藏:0      [点我收藏+]

Java多线程实现的方式有四种

1.继承Thread类,重写run方法

2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

3.通过Callable和FutureTask创建线程

4.通过线程池创建线程

 

前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果

后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中

线程的几个方法:

join

* 让调用的线程先执行指定时间或执行完毕

中断线程的方法

* 中断线程:
* 1.使用interrupt方法,中断线程,设置一个中断状态(标记),但是很多方法会清除此标记
* 2.使用自定义标记的方式

守护线程:

t.setDaemon(true);

//把线程设置为守护线程/*线程可以分为守护线程和用户线程,当进程中没有用户线程时,jvm会退出*/

线程的同步:


* 1.多线程同享数据时,会发生线程不安全的情况()
* 2.多线程共享数据必须使用同步
* 同步三种方法
* 1.使用同步代码块

class MyThread implements Runnable{
private int ticket=10;
//private Object obj=new Object();//同步锁
public void run(){
for (int i=0;i<50;i++){
// synchronized (this){
// ticket--;
// try {
// Thread.sleep(300);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName());
// System.out.println("你购买的票剩余"+ticket+"张");
// }
method();

}
}


* 2.使用同步方法

//同步的对象是当前对象
class MyThread implements Runnable{
public void run(){
for (int i=0;i<50;i++){
method();
}
}

private synchronized void method(){
if (ticket>0){
ticket--;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("你购买的票剩余"+ticket+"张");
}
}


* 3.使用lock(更灵活的代码控制)

}
//互斥锁
ReentrantLock lock=new ReentrantLock();
//lock实现同步
private void method2(){
lock.lock();//锁
try {
if (ticket>0){
ticket--;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("你购买的票剩余"+ticket+"张");
}
} finally {
lock.unlock();//释放锁
}

多线程共享数据,会有安全问题,使用同步可以解决安全问题,但同时会牺牲性能,所以同步的代码块要尽量保持简短,把不随数据变化的
的相关代码块移除代码块,不要阻塞

 

线程的四种实现方式,一些方法及线程的同步

原文:https://www.cnblogs.com/duguo/p/10570238.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!