一、多线程的优缺点
多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能: (1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;
(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;
(4)可以随时停止任务;
(5)可以分别设置各个任务的优先级以优化性能
二、多线程的缺点:
(1) 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
(2)多线程需要协调和管理,所以需要CPU时间跟踪线程;
(3)线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
(4)线程太多会导致控制太复杂,最终可能造成很多Bug;
二、多线程的创建方式
1、继承Thread类
class myThread1 extends Thread{ @Override public void run() { for(int i=0;i<100;i++){ System.in.println(i); } } } public class test2 { public static void main(String[] args) { myThread1 t1 = new myThread1(); t1.start(); } }
该方式,编程比较简单,能够直接使用Thread的类中的方法,但可扩展性比较差,无法再继承其他类。
没有返回值。
2、实现Runnable接口
class myRun implements Runnable{ @Override public void run() { for (int i = 0; i < 50; i++) { System.out.println(Thread.currentThread().getName()+"helloworld");//获取当前线程的名字 } } } public class runTest { public static void main(String[] args) { myRun mr = new myRun(); Thread t1 = new Thread(mr); Thread t2 = new Thread(mr); t1.setName("one");//给线程创建名字 t2.setName("two"); t1.start(); t2.start(); } }
该方式的有很好的可扩展性,实现接口的同时还可以继承其他类,
不能直接使用Thread中的方法,需要
Thread.currentThread()方法获取当前线程的对象。
3、实现Callable接口
public class mycallable implements Callable<Integer> { @Override public Integer call() throws Exception { int sum=0; for (int i = 0; i <=100; i++) { sum+=i; } return sum; } } public class mycallTest { public static void main(String[] args) { Integer result; mycallable mc = new mycallable(); FutureTask<Integer> ft = new FutureTask<>(mc); new Thread(ft).start(); try { result = ft.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { throw new RuntimeException(e); } System.out.println(result); } }
该方法的实现比较复杂,但拥有很好的扩展性的同时还可以返回线程运行的结果。再实现Callable接口时,需要给定泛型,还需要创建FutureTask类的对象,管理线程的结果。
三、多线程的五种状态
1、创建线程对象(新建)
2、有执行资格,没有执行权(就绪)
3、有执行资格,有执行权(运行)
5、没有执行资格,没有执行权(阻塞)
4、线程死亡,变成垃圾(死亡)