什么是进程?线程?什么是线程安全?如何实现线程安全?Java实现多线程有几种方式?

什么是进程?

        电脑中会有很多个程序,每一个程序有一个独立的进程,而进程之间是相互独立存在的。

什么是线程?

        进程要想执行必须依赖线程,进程中的最小执行单位就是线程,一个进程中至少包含一个线程。线程分单线程多线程,那么什么是单线程(串行):比如下载视频,下载是按照顺序执行的,只有下载完第一集才会下载第二集,这样的线程叫单线程。那么多线程就更好理解了:如果你是腾讯的会员,那么你就可以使用多线程,可以同时两个或两个以上视频同时下载,并且在时间上是重叠的。

什么是线程安全?

        当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。

如何实现线程安全?

        方法一:使用synchronized关键字,来控制线程的同步,使用一般加在方法上(public synchronized void xxx)

        当synchronized锁住一个对象之后,别的线程如果想要获取锁对象,那么就必须等这个线程执行完释放锁对象之后才可以,否则一直处于等待状态。注意缩小synchronized的使用范围,如果随意使用时很影响程序的性能,别的对象想拿到锁,结果你没用锁还一直把锁占用,这样就有点浪费资源。

        方法二:使用lock接口,我们在需要的时候去手动的获取锁和释放锁,甚至我们还可以中断获取以及超时获取的同步特性

        lock对象获取锁的方式: lock.lock()   lock.trylock()

        lock()方法在获取锁的时候,如果拿不到锁,就一直处于等待状态,知道拿到锁

        trylock()方法返回值是boolean,如果没有拿到锁,直接返回false,停止等待。但是这样两个线程同时进行,有其中一个线程没有拿到锁,那么直接返回停止等待,就不会执行该线程的run方法了,那么我们可以对trylock方法参数设置等待时间lock.trylock(2,TimeUnit.SECONDS),设置等待两秒钟。

Java实现多线程的集中发方式?

        方法一:继承Thread类,我们在创建Thread类的子类时子类中重写run方法,加入线程所要执行的代码即可。

        方法二:如果这个类已经继承了其他类,就不能在继承Thread类,所以我们可以使用方法二,实现Runnable接口,该接口只有一个方法run(),并没有任何对线程的支持,我们还必须创建Thread类的实例,

        方法三:Thread类和Runnable接口的run方法都没有返回值,但该线程需要有返回值,那么我们就可以用方法三:实现Callable接口,该接口需要有泛型,返回值就是该泛型。采用Callable接口实现多线程启动方式:

        首先我 new 一个我的实现实例,然后将我生成的实例对象注册进入到FutureTask类中,然后将FutureTask类的实例注册进入Thread中运行。最后可以采用FutureTask<V>中的get方法获取自定义线程的返回值。


	public static void main(String[] args) throws InterruptedException, ExecutionException {		
		MyCallable<String> mc=new MyCallable<String>();
		FutureTask<String> ft=new FutureTask<String>(mc);
		new Thread(ft).start();
		String result=ft.get();
		System.out.println(result);
	}

无论我们以怎样的形式实现多线程,最后都要调用Thread类中的statr方法,在Tread中有一个构造方法是传入一个Runnable接口类型的参数,而我们上面的FutureTask<V>实例实现了RunnableFuture<V> 接口,(FutureTask<V>类的构造方法,需要传入一个Callable<V>类型的参数,所以需要创建Callable<V>的对象,传给FutureTask<V>类)而 RunnableFuture<V> 接口又继承了Runnable接口和 Funture<V>接口,因此我们可以将FutureTask<V> 的一个实例当做是一个Runnable接口的实例传入Thread来启动我们新建的线程。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值