线程
一.什么叫线程
进程:进行中的程序;作为资源分配的单位。
线程:轻量级的进程;程序里的顺序控制流,可以理解为程序里不同的执行路径;作为调度和执行的但我i;多个线程可以共享内存,共享地址。相互间的通信十分迅速
线程体为run()方法(直接调用run()视为普通方法),启动线程为start()方法;
这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 而如果直接用Run方法, 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
真正的多线程是指有多个CPU,而我们自己用的电脑,实际上是模拟多线程,来多个线程之间来回切换,然而由于切换的时间非常之短,所以我们所看到的就好像同时进行多个线程一样
二.如何创建线程
1.继承Thread类,重写run()方法
线程类:Rabbit(兔子)’与Tortoise(乌龟)类:
public class Rabbit extends Thread{@Overridepublic void run() {//线程体for (int i =0; i < 100; i++){System.out.println("兔子跑了"+i+"步");}} } /*乌龟类*/ class Tortoise extends Thread {@Overridepublic 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{@Overridepublic 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;@Overridepublic 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