一:java创建线程的三种方式:
1.继承Thread类;
2.实现Runnable接口;
3.实现Callable接口:Callable接口重写的是 call() 方法。1-允许有返回值,2-允许抛出异常。
二:java线程运行状态:
NEW:初始状态,线程被构建,但是还没有调用start()方法;
RUNNABLE:运行状态,java线程将操作系统中的就绪和运行两种状态笼统地称作“运行中“;
BLOCKED:阻塞状态,表示线程阻塞于锁;
WAITING:等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其它线程做出一些特定动作(通知或中断);
TIME_WAITING:超时等待状态,它是可以在指定的时间自行返回的;
TERMINATED:表示当前线程已经执行完毕;
三:线程的启动和停止:调用线程的start()方法进行启动,随着run()方法的执行完毕,线程也随之终止。
启动:线程对象在初始化完成之后,调用start()方法就可以启动这个线程。线程start()方法的含义是:当前线程(即parent线程)同步告知java虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线程。
终止:
1.过时的方法:暂停—suspend();恢复—resume(); 停止—stop();它们过时的原因均是,在方法调用后,不会保证线程所占有的资源被正常释放。
2.通过响应中断来停止线程:中断可以理解为线程的一个标识位的属性,它表示一个运行中的线程是否被其他线程进行了中断操作,中断操作好比其它线程对该线程打了招呼,
其它线程通过调用该线程的interrupt()方法对其进行中断操作。
线程通过检查自身是否被中断来进行响应,线程通过方法isInterrupted()来进行判断是否被中断。
3.利用一个boolean变量来控制需要停止的任务并终止该线程。
四:两个关键字
volatile:可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。
synchronized:可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。
五:等待/通知机制
等待/通知:是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。上述两个线程通过对象O来完成交互。
wait()方法会释放锁,在调用notify()或notifyAll()方法后不会立即释放锁,需要等待调用的线程释放锁之后,线程才会从wait()方法返回。
六:锁
锁是控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。
1.synchronized实现锁功能;2.Lock接口实现锁功能;
synchronized:隐式获取与释放锁;
未完待续