http://bbs.itheima.com/thread-3077-1-1.html 1、为什么需要使用多线程 1.)之前我们的程序都是顺序执行的,后面的代码都是要等前面的代码执行完毕,才能获得执行; 2.)有些时候,当一个应用程序在做一件事的时候,很可能需要同时做其它的事情。比如:控制台等待用户输入的时候,如果此时需要同时接收网络数据,这时就需要编程语言为我们提供这种机制;QQ程序:聊天窗口,程序在等待用户输入数据,此时它也需要同时接收网络数据;还要同时刷新好友列表;3.)所以很多程序都需要在做一件事情的时候,同时还要做其它的事情,这就需要编程语言提供这种机制。这种机制叫:多线程; 2、进程等概念定义 1)进程:一般来说一个应用程序开始运行,它就是一个主"进程"。它由操作系统管理;每一个进程都有它自己的内存空间和系统资源。 2)线程:是由某个进程单独启动的一个独立运行代码块。一个线程,一旦启动之后,同主进程一样,一起竞争系统资源。一个进程,可以开出很多的线程。 一个线程就是一个单独的执行路径。多个线程,就是多个执行路径,所有的这些执行路径同时竞争系统资源; 3)单线程:一个应用程序只有一条执行路径。(之前我们开发的所有程序)多线程:一个应用程序开出多个线程,也就是具有多个执行路径。 4).Java程序运行的原理:由虚拟机加载启动的main()方法所在类;同时,虚拟机在后台也会运行一些其他的程序:例如:垃圾回收器。java虚拟机也是一个多线程的程序; 5)并行是逻辑上同时发生,指在"某一个时间内"同时运行多个程序。并发是物理上同时发生,指在"某一个时间点"同时运行多个程序。 3、线程实现方式 线程的实现方式一 1.定义一个类,继承自java.lang.Thread2.重写里面的run()方法; 3.在测试类中,实例化自定义类的对象,并调用它的start()方法,启动一个线程; Class A extends Thread{ Public void run(){ } } Class demo{ Main{ A t = new A(); t.stard(); } } 线程的实现方式二: 1.定义一个类,实现Runnable接口;2.重写里面的run()方法 3.在测试类中: Thread t = new Thread(自定义类对象引用); t.start();简化的写法:new Thread(自定义类对象引用).start(); Class A implements Runnable{ Public void run (){ } } Class demo { Main(){ A t = new A(); Thread t1 = new Thread (t,”邓超”); T1 .start(); } } 4、多线程 基础应用 (1):获取和设置线程的名称: 默认线程名称:Thread + 编号 : 编号从0开始,第一个启动的编号为0; setName设置线程名称: getName获取线程名称: t1.setName("邓超") t2.setName("孙俪"); Syotem.out.print(t1 . getName()); (2)线程优先级: 1.当多个线程同时并行运行时,可以设置它们的优先级。 2.具有较高优先级的线程,可能会被操作系统分配更多的执行机会,可能会更早的执行完毕;4.Java中,线程的优先级级别:1-10:从低到高 t1.setName("线程1");t2.setName("线程2"); t1.setPriority(1);t2.setPriority(10); (3)线程的休眠:Thread --> public static void sleep(long millis) MyThread t = new MyThread(); try {//当前线程休眠Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace(); } } t.start(); (4)线程的加入:Thread --> public final void join():等待该线程终止。 t1.setName("兵1");t2.setName("兵2");t1.start();//可以让t1先冲,先去杀敌,你杀完,我再杀try {t1.join();} catch(InterruptedException e) {e.printStackTrace();} t2.start(); (5)线程的礼让:public static void yield():暂停当前正在执行的线程对象,并执行其他线程。此方法将当前线程退回到"就绪"状态,意味着同其他的线程再次站在同一起跑线上,由操作系统决定分配CPU资源,也很有可能会yield()之后,会马上被分配到CPU时间。 (6)默认情况下,当前进程开出的所有线程都是"非守护线程":当主进程结束,会等待所有线程结束,应用程序才会结束;让开出的线程作为"守护线程":Thread -->public final void setDaemon(boolean on):如果为true,为守护线程守护线程:当主进程结束时,所有的"守护线程"也会结束。(但不会立即结束,通常会有个小缓冲) MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); t1.setDaemon(true); t2.setDaemon(true); (7)停止线程: public final void stop(): public void interrupt(): MyThread t = new MyThread(); t.start();t.interrupt();
|