多线程学习复习要点(持续更新中)

1、同步:单线程

     异步:多线程


2、多线程编程主要两种方式:

    一种继承Thread类;另一种实现Runnable接口


3、线程执行:

public class MyThread extends Thread{

             ............................

}

MyThread    thread = new MyThread();

thread.start();       此线程交给线程规划器执行,为异步执行

thread.run;此线程交给main主线程执行,为同步执行


4、线程停止不用stop()方法,用interrupt(),且interrupt()并不是真正的停止线程,只是在在当前正在运行的线程上打了一个标记,interrupted()判断完是否为中断会清除中断状态标志,如果interrupt()之后,连续两次interrupted(),第一次为true,第二次为false;

isIntterrupted()判断完是否为中断不会清除中断状态标志,如果interrupt()之后,连续两次interrupted(),第一次为true,第二次还为true;

5、如何停止线程:

<1>异常停止(推荐使用):先用interrupt()打标志,再用interrupted()或isIntterrupted()判断,如果为true抛出InterruptedException()来停止线程。

<2>异常停止(推荐使用):当线程在睡眠时,即当线程在执行sleep()时执行interrupt(),或者先执行interrupt(),一旦遇到线程执行sleep()也会抛出异常,异常停止i线程

补充:线程的synchronized代码块中若执行wait()方法,线程再执行interrupt()也会停止线程,抛出异常。

<3>暴力停止(不推荐使用):stop()来停止线程,一方面清理性工作可能无法完成,另一方面会导致对象解锁,无法让数据得到同步处理,导致数据不一致。

<4>interrupt()与return结合:interrupt()后使用interrupted()或isIntterrupted()判断,然后return即可。


6、由于常量池特性,即如果

String a ="aa";   String b="bb"; 

则System.out.println(a==b);会显示为true,

因此,同步代码块 synchronized ()中不使用String作为锁对象,即不使用synchronized(String aa)


7、多线程并发,着重点:“外练互斥,内修可见”


8、wait()使线程停止运行,notify()使停止的线程继续运行,注意:执行完notify()之后,wait状态的线程不会马上执行,要等到执行notify()方法的程序执行完,也就是退出synchronized代码块之后,当前线程才会释放锁。

9、join()方法:

作用:等待线程对象销毁

例子:

public static void main(String[] args){

        MyThread thread = new MyThread();

        thread.start();

        thread.join();

       System.out.println("haha");

}

解释:由于主线程想要在子线程thread执行完run中的内容之后再显示haha,所以加入thread.join()即可,join()具有使线程排队的作用,类似于同步synchronized

10、join(long) 和sleep(long)都是等待若干时间,区别在于sleep(long)不释放锁,join(long)释放锁

11、ThreadLocal:

变量值的共享可以用public static,所有线程都共同使用public static变量,如果想每一个线程都拥有自己的共享变量,可以使用ThreadLocal

12、ReentrantLock和Condition 可以实现synchronized与wait()、notify()和notifyAll()的等待通知模式,而且更加灵活:可以实现多路通知以及选择性线程通知的功能。

wait() 对应 await();

wait(long timeout) 对应await(long time, TimeUnit unit);

notify() 对应 signal();

notifyAll() 对应 signalAll();


13、ReentrantReadWriteLock()中的方法,读读操作可共享线程,读写、写读、写写都是互斥,即只有要写就只有释放锁,其他线程才可以运行。

14、定时器Timer:

(1)shedule(TimerTask task,  Date time)作用:在指定的日期执行某任务

(2)shedule(TimerTask task, Date firstTime, long period)作用:在指定日期之后,按照指定间隔周期性的无限循环的执行某一任务

(3)TimerTask的cancel()和Timer的cancel()的区别:TimerTask中的cancel()是将自身从任务队列中清除,Timer的cancel()是将任务队列中所有的任务清除。

(4)shedule(TimerTask task, long delay)作用:当前时间为参考时间,在此基础上延迟delay时间后执行一次task任务。

(5)shedule(TimerTask task, long delay, long period):当前时间为参考时间,在此基础上延迟delay时间后执行task任务,然后再以period为周期无限次的循环执行task任务

(6)shedule(TimerTask task, Date firstTime, long period)和sheduleAtFixedRate(TimerTask task, Date firstTime, long period)区别:

区别1:shedule和sheduleAtFixedRate主要区别在于不延时的情况,shedule在不延时的情况下,下一次任务执行时间是上一次任务开始的时间,而sheduleAtFixedRate是下一次任务执行的时间是上一次任务结束的时间(和shedule和sheduleAtFixedRate延时的情况一样

注意:这里的不延时指的是Date firstTime中的时间比当前时间要早,所以会立即执行而无须等待,反之则为延时。

区别2:shedule不具有追赶性,即若设定的firstTime为2014-10-12 15:37:00 而当前时间为2014-10-12 15:39:00,则在37和39之间的任务不会被执行,而sheduleAtFixedRate具有追赶性


15、并发和并行的区别:

并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。

所以我认为它们最关键的点就是:是否是『 同时 』。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值