多任务处理有两种类型:
--基于进程
--基于线程
进程:是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存。
线程:是进程内部单一的顺序控制流。一个进程拥有多个线程。多个线程共享一个进程的内存空间。
主线程:
main方法一运行,就开启主线程。
主线程特点:
1、最先开始
2、最后结束
3、可以开启其他的子线程
4、回收资源
创建线程的方式:
方式一: 继承Thread类,然后重写run()方法。
方式二: 实现Runnable接口,实现run()。
线程中start方法和run方法的区别:
启动线程,应该调用线程类的start()方法,是在主线程之外,另外创建子线程。主线程和子线程交替运行。
如果直接调用run()方法,不会单独创建子线程,是普通方法调用,会在run()执行完毕以后,再去执行其他代码。
1 package 线程; 2 3 4 5 public class ThreadTest { 6 public static void main(String[] args) { 7 8 //方式一线程 测试 9 OneThread on=new OneThread(); 10 //启动线程。线程启动后,会调用Thread类的run() 11 on.start(); 12 //只是普通的该方法调用,只有该方法执行完后才会执行其他方法 13 on.run(); 14 //方式二线程 测试 15 TwoThread two=new TwoThread(); 16 //以Runnable 接口实现类作参数,表示线程启动后,会调用Runnable实现类的run() 17 Thread th=new Thread(two); 18 th.start(); 19 20 for (int i = 0; i <10; i++) { 21 System.out.print(i+" "); 22 try { 23 //休眠,让当前线程休眠500毫秒,然后继续执行 24 Thread.sleep(500); 25 } catch (InterruptedException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 } 30 } 31 32 } 33 /** 34 * 创建线程 方式一 35 * @author Administrator 36 * 37 */ 38 class OneThread extends Thread{ 39 40 @Override 41 public void run() { 42 for (int i = 10; i < 20; i++) { 43 System.out.print(i+" "); 44 try { 45 Thread.sleep(500); 46 } catch (InterruptedException e) { 47 // TODO Auto-generated catch block 48 e.printStackTrace(); 49 } 50 } 51 } 52 } 53 /** 54 * 创建线程 方式二 55 * @author Administrator 56 * 57 */ 58 class TwoThread implements Runnable{ 59 60 @Override 61 public void run() { 62 for (int i = 20; i <30; i++) { 63 System.out.print(i+" "); 64 } 65 try { 66 Thread.sleep(500); 67 } catch (InterruptedException e) { 68 // TODO Auto-generated catch block 69 e.printStackTrace(); 70 } 71 } 72 }
线程状态:
新建: 通过new的方式产生一个线程对象
就绪: start启动,运行run方法
运行: 执行run方法
死亡: 线程run()方法执行完毕
睡眠: 调用线程sleep()方法
等待: 调用Object的wait()方法
挂起:调用yield()方法,线程显示出让CPU控制权。
阻塞: 等待IO事件输入。如JOptionPane输入框
线程优先级:
当两个或两个以上的线程同时处理就绪状态,那么优先级高的线程,会优先得到执行。线程的优先级分为10级,默认为5级。数字越大,优先级越高。在开发中可以通过Thread类的setPriority()改变优先级。