多线程详解

Posted promiss911

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程详解相关的知识,希望对你有一定的参考价值。

一.多线程的创建与启动

1、继承Thread类:

  • 步骤:
    ①、定义类继承Thread;
    ②、复写Thread类中的run方法;
    目的:将自定义代码存储在run方法,让线程运行
    ③、调用线程的start方法:
      该方法有两步:启动线程,调用run方法。

  • 不建议使用:避免OOP单继承局限性

  • 实例:

public class TestThread1 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("我在打游戏"+i);
        }
    }

    public static void main(String[] args) {
        TestThread1 testThread1 = new TestThread1();
        testThread1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学习"+i);
        }
    }
}

2、实现Runnable接口: 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参方法。

  • 实现步骤:
    ①、定义类实现Runnable接口
    ②、覆盖Runnable接口中的run方法将线程要运行的代码放在该run方法中。
    ③、通过Thread类建立线程对象。
    ④、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
    自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程执行指定对象的run方法就要先明确run方法所属对象
    ⑤、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

  • 推荐使用:避免单继承局限性,灵活多变,方便同一对象被多线程使用.

  • 实例:

public class TestThread3 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我在打游戏"+i);
        }
    }

    public static void main(String[] args) {
        //创建Runnable实现类对象
        TestThread3 testThread3 = new TestThread3();
        new Thread(testThread3).start();
        for (int i = 0; i < 100; i++) {
            System.out.println("我在学习"+i);
        }
    }
}
  • 多个线程操作同一资源时,数据出现紊乱:
//多个线程操作同一资源时,数据出现紊乱
public class TestThread4 implements Runnable {
     //火车票数
    private int ticketNums=15;

    @Override
    public void run() {
        while(true){
            if(ticketNums<=0){
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums+"张票");
            ticketNums--;
        }
    }

    public static void main(String[] args) {
        TestThread4 testThread4 = new TestThread4();
        new Thread(testThread4,"我").start();
        new Thread(testThread4,"你").start();
        new Thread(testThread4,"黄牛").start();

    }
}
  • 采用龟兔赛跑的例子实现多线程:
public class Race implements Runnable {

    private static String winner;

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if(Thread.currentThread().getName().equals("兔子")&&(i%10==0)){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            boolean flag = isOver(i);
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName() + "跑了第" + i + "步");

        }


    }

    public boolean isOver(int i) {
        if (winner != null) {
            return true;
        } else if (i == 100) {
            winner=Thread.currentThread().getName();
            System.out.println(winner + "获得胜利");
            return true;
        } else
            return false;
    }

    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"乌龟").start();
        new Thread(race,"兔子").start();
    }

}

3、通过Callable和Future创建线程:

  • 实现步骤:
    ①、创建Callable接口的实现类,并实现call()方法,改方法将作为线程执行体,且具有返回值。
    ②、创建Callable实现类的实例,使用FutrueTask类进行包装Callable对象,FutureTask对象封装了Callable对象的call()方法的返回值
    ③、使用FutureTask对象作为Thread对象启动新线程。
    ④、调用FutureTask对象的get()方法获取子线程执行结束后的返回值。















以上是关于多线程详解的主要内容,如果未能解决你的问题,请参考以下文章

20160226.CCPP体系详解(0036天)

多线程 Thread 线程同步 synchronized

LINUX操作系统知识:进程与线程详解

JAVA多线程synchronized详解

多个用户访问同一段代码

20160227.CCPP体系详解(0037天)