java知识点四:线程基础

线程

一.什么叫线程

进程:进行中的程序;作为资源分配的单位。

线程:轻量级的进程;程序里的顺序控制流,可以理解为程序里不同的执行路径;作为调度和执行的但我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

 

猜你喜欢

转载自www.cnblogs.com/python-road/p/10465789.html