线程(①:创建方式 ②:线程的生命周期 ③:安全问题怎么解决(3种方式--同步)④:线程池)

多线程的出现就是为了提高效率。一个应用程序就可以看做一个线程,进程中包含了多个可以同时运行的线程。
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。

创建方式::::::::::::::::::::::::::::
1)继承Thread类创建线程
定义thread子类,重写run(),调用start()
2)实现Runnable接口创建线程
实现runnable接口,重写run()
创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
调用start()
3)使用Callable和Future创建线程
call()方法可以有返回值,可以声明抛出异常

线程的生命周期:::::::::::::::::::::::::::::::::
线程(①:创建方式 ②:线程的生命周期 ③:安全问题怎么解决(3种方式--同步)④:线程池)

线程安全问题解决办法:::::::::::::::::::::::::::::::

方法一、同步代码块
语法:
synchronized(同步锁){
//需要同步操作的代码
}

方法二、同步函数
使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着.

方法三、同步锁
在Lock接口中lock方法和unLock方法分别是获取锁和释放锁。

总结:
Synchronized:
使用synchronized关键字修饰方法,会导致加锁,虽然可以使该方法线程安全,但是会极大的降低该方法的执行效率,故要慎用该关键字。
采用锁机制,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。

线程池:::::::::::::::::::::::::::::::
线程池:实际开发中,面临线程的反复创建和销毁,这样会消耗内存,线程池概念由此而生.
线程池可以方便的管理线程,用就取,不用就在里面放着.

使用线程池中线程对象的步骤:
1.创建线程池对象
2.创建Runnable接口子类对象(task)
3.提交Runnable接口子类对象(take task)
4.关闭线程池(一般不做)