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、并发和并行的区别:
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。