1.多线程:如果一个程序的执行路径是多条的,那么这个程序就是多线程程序.
多线程的意义:提高CPU的使用率
并行:指逻辑上的同时,在一个时间段内.
并发:指物理上的同时,在一个时间点上.
***********************************************************************
2.面试题
Java程序是多线程的吗?
答:Java虚拟机的启动是多线程的
至少两条线程:
1)main方法可以被虚拟机识别
2)由于创建匿名对象的时候,只是在堆内存中开辟空间,里面对象最终会变成垃圾,需要垃圾回收器进行回收,通过gc()启动垃圾回收器---->垃圾回收线程
3.实现多线程的三种方式
方式(1):
1)自定义一个类MyThread,继承自Thread类
2)重写该Thread类中的run()方法:里面写一些耗时的操作
3)创建自定义类对象
4)利用自定义类对象启动线程
方式(2):
1)自定义一个类,该类实现Runnable接口
2)重写Runnable里的run()方法:写耗时操作
3)在main()方法中,创建该类的对象(统一资源)
多线程的意义:提高CPU的使用率
并行:指逻辑上的同时,在一个时间段内.
并发:指物理上的同时,在一个时间点上.
***********************************************************************
2.面试题
Java程序是多线程的吗?
答:Java虚拟机的启动是多线程的
至少两条线程:
1)main方法可以被虚拟机识别
2)由于创建匿名对象的时候,只是在堆内存中开辟空间,里面对象最终会变成垃圾,需要垃圾回收器进行回收,通过gc()启动垃圾回收器---->垃圾回收线程
3.实现多线程的三种方式
方式(1):
1)自定义一个类MyThread,继承自Thread类
2)重写该Thread类中的run()方法:里面写一些耗时的操作
3)创建自定义类对象
4)利用自定义类对象启动线程
方式(2):
1)自定义一个类,该类实现Runnable接口
2)重写Runnable里的run()方法:写耗时操作
3)在main()方法中,创建该类的对象(统一资源)
4)创建Thread类对象,将自定义类对象作为统一对象进行传递,启动线程
方式(3):
1)创建线程对象对象:ExecutorService
2)自定义一个类实现Callable接口,实现call()方法(call方法的返回值与Callable的泛型一致)3)在main方法提交submit(new M与Callable)
使用匿名内部类实现前两种方式
//继承自Thread类的匿名内部类的方式 new Thread(){ @Override public void run() { for(int x = 0 ;x <100 ; x ++){ System.out.println(getName()+":"+x); } } }.start() ; //方式2:使用Runnable接口的方式 new Thread(new Runnable() { @Override public void run() { for(int x =0 ; x <100 ;x ++){ System.out.println(Thread.currentThread().getName()+":"+x); } } }).start() ; //更有难度的 new Thread(new Runnable() { @Override public void run() { for(int x = 0 ; x <100; x ++){ System.out.println("hello"+x); } } }){ @Override public void run() { for(int x = 0 ; x < 100 ; x ++){ System.out.println("world"+x); } } }.start() ;
4.解决线程问题三要素:
(1)程序是否是多线程的环境
(2)是多有共享数据
(3)是否对共享数据有多条语句进行操作
解决:synchronized(对象):同步机制
锁定操作:lock接口--->实现ReenTrantlock
5.多线程的弊端?
(1)线程安全,但是效率低 (2)容易产生死锁
解决:等待唤醒机制:生产者线程和消费者线程
问题:notify(),wait(),notifyAll():为什么不定义在Thread类中,而是定义在Object类中?
答:对于线程来说,同步锁的对象:任意对象,而且这写方法可以任意锁对象调用,所以这些类被定义在Object类中.
6.线程池的创建步骤:
(1)创建程序池对象:Exctutor工厂类
(2)提交任务:submit(new MyRunnable())方法
(3)结束程序池:shutdown()方法