多线程的概念:多线程是一种机制,它允许在程序中并发的执行多个线程,且每个线程间相互独立。
实现多线程的两种方式:
1、继承java.lang.Thread类,并且重写它的run方法,将线程的执行主体放在其中;
2、实现java.lang.Runnable接口,实现它的run方法,并将线程的执行主体放在其中;
线程有五大状态:
1、新建状态(New):使用new操作符创建一个线程的时候,线程还没有开始执行;
2、就绪状态(Runnable):当线程调用了start方法之后,线程就进入就绪状态;处于就绪状态的线程不一定立即运行run方法,只有获取到cpu时间才可以执行run方法;
3、运行状态(running):当线程获取到了cpu运行时间之后,就进入到运行状态了,调用run方法;
4、阻塞状态(blocked):正在运行的线程还没有结束,暂时让出cpu,这时其他就绪线程就有机会获得cpu时间;
以下原因会导致线程进入阻塞状态:
1、线程调用sleep方法进入睡眠状态;
2、线程在调用一个在i/o上被阻塞的操作
3、线程试图去获得一个锁,但是这个锁被其他线程持有;
。。。。。。
5、死亡状态(Dead):
有以下的原因可导致线程死亡:
1、run方法正常退出而正常死亡;
2、一个未捕获的异常导致线程意外退出而死亡;
可以用isAlive方法来判断线程是否还活着,只要是线程处于运行或者阻塞状态,就返回true;如果线程状态是New且不是可运行的状态或者线程死亡了,则返回false;
线程同步(synchronized):
可以同步方法,也可以同步代码块;对于同步方法来说,每个方法只有获取到所属类实例的锁才可以被执行,一旦该方法被执行,则独占锁,知道方法返回时或者异常退出时才会释放掉锁;
同步代码块也是一样,当两个并发线程访问同一个对象中的这个synchronized(this)代码块的时候,一个时间内只有一个线程得到执行,另一个线程只有在这个线程执行完成之后才可以执行;
线程同步之Lock:
Lock是一个接口,它位于java 5.0新增的java.utils.concurrent包的子包locks中,实现Lock接口类具有与synchronized关键字相同的功能,但是它的功能强大一些,java.utils.concurrent.locks.ReentrantLock是比较常用的;注意需要在finally中unlock释放锁;
线程阻塞:
sleep()方法、suspend和resume方法、yield方法、wait和notify方法都可以使线程进入阻塞状态;但是yield方法和wait方法都会释放cpu时间,而sleep方法和suspend不会释放cpu时间;
终止线程的方法:
1、当run方法执行完毕,自动终止;
2、使用stop方法,不过这个方法不推荐使用,会有意料不到的后果;
3、使用interrupt方法
多个客户端一个服务器的实现方法:
利用多线程技术,服务器socket负责监听端口,设置一个无限循环,在其中实现:将监听到的socket实例赋值 给线程并且启动线程,由线程来完成业务逻辑;