线程
一.什么叫线程
进程:进行中的程序;作为资源分配的单位。
线程:轻量级的进程;程序里的顺序控制流,可以理解为程序里不同的执行路径;作为调度和执行的但我i;多个线程可以共享内存,共享地址。相互间的通信十分迅速
线程体为run()方法(直接调用run()视为普通方法),启动线程为start()方法;
这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 而如果直接用Run方法, 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
真正的多线程是指有多个CPU,而我们自己用的电脑,实际上是模拟多线程,来多个线程之间来回切换,然而由于切换的时间非常之短,所以我们所看到的就好像同时进行多个线程一样
二.如何创建线程
1.继承Thread类,重写run()方法
线程类:Rabbit(兔子)’与Tortoise(乌龟)类:
public class Rabbit extends Thread{ @Override public void run() { //线程体 for (int i =0; i < 100; i++){ System.out.println("兔子跑了"+i+"步"); } } } /*乌龟类*/ class Tortoise extends Thread { @Override public void run() { //线程体 for (int i =0; i < 100; i++){ System.out.println("乌龟跑了"+i+"步"); } } }
应用线程类方法:线程体是run()方法,启动线程是start()方法,直接调用run()是普通方法,并且启动线程并不等于运行了,具体还需要等待cpu调度
public class RabbitApp { public static void main(String[] args) { //创建子类对象 Rabbit rabbit = new Rabbit(); Tortoise tortoise = new Tortoise(); //调用start()方法,启动线程 rabbit.start(); tortoise.start(); for(int i =0; i < 10; i++){ System.out.println("main>>>>>>"); } } }
结果:
2.实现Runnable接口,实现run方法
优点:避免单继承;方便共享资源
实现接口的线程类
public class Programer implements Runnable{ @Override public void run() { for(int i = 0; i < 100; i++){ System.out.println("一边敲HelloWorld"); } } }
应用类:
public class ProgramerApp { public static void main(String[] args) { //创建真实角色 Programer p = new Programer(); //创建代理角色+持有真实角色引用 Thread proxy = new Thread(p); //是用代理角色启动线程 proxy.start(); for (int i = 0; i < 100; i++) { System.out.println("一边聊QQ"); } } }
结果:
应用:
public class Web12306 implements Runnable{ private int num = 50; @Override public void run() { while (true) { if(num < 0){ break; } System.out.println(Thread.currentThread().getName()+"抢到了"+num--); } } public static void main(String[] args) { //创建真实对象 Web12306 web12306 = new Web12306(); //创建代理对象 Thread t1 = new Thread(web12306,"黄牛甲"); Thread t2 = new Thread(web12306,"黄牛乙"); Thread t3 = new Thread(web12306,"黄牛丙"); //启动线程 t1.start(); t2.start(); t3.start(); } }
结果:
3.线程的五种状态
详细状态:
创建:两种方式:1.继承Thread类,重写run()方法;2.实现Runnable接口,实现run()方法。——new出一个线程。
就绪:调用Thread的start()方法(第二种实现接口方式使用静态代理)
运行:得到时间片,开始运行
阻塞:遇到阻塞时间——解除阻塞回到就绪状态
终止:线程死亡,严禁使用stop()方法,而应该定义一个boolean flag,并在run方法中判断标志进行合理结束run()方法进而结束进程
更多线程面试知识:http://www.cnblogs.com/dolphin0520/p/3932934.html