Thread和Runnable实现多线程(一)上

实现多线程,有两种方式,一种是继承 Thread 类,一种是实现 Runnable接口。


一. Thread 类


public class Thread extends Object  implements Runnable{

}


继承 Thread 实现多线程。


一.一 实现多线程操作


一.一.一 创建类, 继承 Thread


 class MyThreadDemo extends Thread {
        @Override
        public void run(){
            //多线程执行的方法
            for(int i=0;i<10;i++){
                System.out.println("输出:"+i);
            }
        }
  }


一.一.二 主线程调用


 @Test
    public void runTest2(){

        //实例化了两个对象。 
        MyThreadDemo thread1=new MyThreadDemo();

        MyThreadDemo thread2=new MyThreadDemo();

        //对同一个,是无法多次启动的。
        thread1.start();

        thread2.start();
    }


运行程序,查看控制台输出:


Thread和Runnable实现多线程(一)上


会发现两个线程会交叉执行。 每一次运行,结果都是不一样的。


注意,调用的时候,是 .start() 方法,而不是 .run() 方法。 如果是 .run()方法的话,那就是调用普通的方法run(), 会依次执行,并不会并发执行。


另外,也要注意, 同一个线程,只能启动一次, 不能重复两次。


  @Test
    public void runTest2(){

        MyThreadDemo thread1=new MyThreadDemo();

        MyThreadDemo thread2=new MyThreadDemo();

        //对同一个,是无法多次启动的。
        thread1.start();
        //启动了两次,则会报错的。 
        thread1.start();
    }


java.lang.IllegalThreadStateException


一.二 多线程的时机


主程序中的代码,放置在启动之后,才可以触发多线程。


 @Test
    public void runTest3() throws Exception{


        //上半部分
        for(int i=0;i<10;i++){
            System.out.println("主线程输出:"+i);
        }

        MyThreadDemo thread1=new MyThreadDemo();
        //对同一个,是无法多次启动的。
        thread1.start();

        //下半部分
        /*for(int i=0;i<10;i++){
            System.out.println("主线程输出:"+i);
        }*/
    }


注释掉下半部分, 使用上半部分代码,运行程序:


Thread和Runnable实现多线程(一)上


并不会触发多线程。


注释掉上半部分,使用下半部分代码,运行程序:


Thread和Runnable实现多线程(一)上


触发了多线程。


二. Runnable 接口


@FunctionalInterface
public interface Runnable {

    public abstract void run();
}


有一个抽象方法, run()


二.一 Runnnable 接口实现多线程


二.一.一 创建类,实现 Runnable接口


class MyRunnableDemo implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println("输出Runnable:"+i);
            }
        }
    }


二.一.二 主线程调用


@Test
    public void test1(){
        //实例化两次对象
        MyRunnableDemo myRunnableDemo1=new MyRunnableDemo();

        MyRunnableDemo myRunnableDemo2=new MyRunnableDemo();
        //分别放置到不同的线程里面
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo2);

        //启动
        thread1.start();

        thread2.start();
    }


运行程序,看控制台输出:


Thread和Runnable实现多线程(一)上


每一次运行,结果都是不一样的。


注意, 线程也可以创建一个 MyRunnableDemo 对象


 @Test
    public void test2(){

        //只实例化一次即可
        MyRunnableDemo myRunnableDemo1=new MyRunnableDemo();
        //将同一个对象,放置到不同的线程里面
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo1);

        //启动
        thread1.start();
        thread2.start();

    }


运行程序,同样可以达到多线程的操作。


Thread和Runnable实现多线程(一)上


常常采用,实际化一次对象的形式。

上一篇:【RAC】cssfatal缺少导致的节点1无法启动


下一篇:我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。