java创建多线程的方式以及注意的点

第一种方式 继承于Thread类

public class MyThread extends Thread {

    @Override
    public void run() {
        //执行的方法,实现所需的功能
        int i=10;
        do {
            System.out.println("线程启动");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            i++;
        }while (i<4);


    }
}

测试

public class Main {

    public static void main(String[] args) {
        //第一种方式
       new MyThread().start();//创建并启动

    }
}

第二种方式 实现Runnable接口

public class MyThread2 implements Runnable {
    @Override
    public void run() {

        int arr[] = {1,2,3};
        //增强for
        for(int i : arr){
            System.out.println("数值为=="+i);
        }

    }
}

测试

public class Main {

    public static void main(String[] args) {
    

        //第二种方式
        MyThread2 myThread2 = new MyThread2();
        Thread thread=new Thread(myThread2);
        thread.start();



    }
}

 

第三种方式 通过匿名内部类的方式创建

public class MyThread3 {

     //使用匿名内部类的方式创建

     public static void main(String[] args) {

         //第一种方式 继承Thread类 重写run方法

//         new Thread(){
//             @Override
//             public void run() {
//
//                     for (int i = 0; i<5 ;i++){
//                         System.out.println("i的数值是==="+i);
//                     }
//
//             }
//         }.start();


         //第二种方式  实现runnbale接口

          new Thread(new Runnable() {
              @Override
              public void run() {

                  for (int i = 0; i<5; i++){
                      System.out.println("i的数值是=="+i);
                  }


              }
          }).start();
     }

}

 

第四种方式 使用Callable接口实现类并实现call方法

public class Demo {

    public static void main(String[] args) throws Exception {

        //创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例
        Callable<Integer> call = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("计算1+......100的和");
                int sum =0;

                    for (int i=1;i<=100;i++){
                        sum+=i;
                    }
                    Thread.sleep(1000);
                    System.out.println("----结果是----");
                    return sum;


            }
        };
        //使用FutureTask类来包装Callable对象
        FutureTask<Integer> task = new FutureTask<>(call);
        Thread thread = new Thread(task);
        //启动线程
        thread.start();
        System.out.println("拿到的结果是==="+task.get());

    }

}

 

注意的点 创建两个线程

public class MyThread4 extends  Thread{

    private int ticket = 5;
    @Override
    public void run() {

        while (true){

            if (ticket>0){
                System.out.println("当前执行的线程名称是: "+Thread.currentThread().getName()+" 出票数是:"+ticket--);

            }else {
                System.exit(0);
            }

        }


    }
}

测试方式一:

public static void main(String[] args){


            //报出异常,是因为同一个Thread不能重复调用start方法
            //并且执行的结果来看只运行了一个线程,说明每创建一个Thread对象,只能够创建一个线程
            /*
            
            Exception in thread "main" java.lang.IllegalThreadStateException
            当前执行的线程名称是: Thread-0 出票数是:5
            当前执行的线程名称是: Thread-0 出票数是:4
            当前执行的线程名称是: Thread-0 出票数是:3
            当前执行的线程名称是: Thread-0 出票数是:2
            当前执行的线程名称是: Thread-0 出票数是:1
            
           */
            Thread t1= new MyThread4();
            t1.start();
            t1.start();

}

测试方式二

public static void main(String[] args){

          //从执行的结果来看,创建了两个线程对象,各自执行自己的互不影响
          /*

          当前执行的线程名称是: Thread-0 出票数是:5
          当前执行的线程名称是: Thread-0 出票数是:4
          当前执行的线程名称是: Thread-0 出票数是:3
          当前执行的线程名称是: Thread-0 出票数是:2
          当前执行的线程名称是: Thread-0 出票数是:1
          
          当前执行的线程名称是: Thread-1 出票数是:5
          当前执行的线程名称是: Thread-1 出票数是:4
          当前执行的线程名称是: Thread-1 出票数是:3
          当前执行的线程名称是: Thread-1 出票数是:2
          当前执行的线程名称是: Thread-1 出票数是:1
           */
           new MyThread4().start();
           new MyThread4().start();

}

测试方式三

public static void main(String[] args){

         //启动四个线程,并实现资源共享的目的
    
       /*
       
       当前执行的线程名称是: Thread-1 出票数是:5
       当前执行的线程名称是: Thread-2 出票数是:4
       当前执行的线程名称是: Thread-1 出票数是:3
       当前执行的线程名称是: Thread-3 出票数是:1
       当前执行的线程名称是: Thread-2 出票数是:2
           
       */
       
         MyThread4 t = new MyThread4();
         new Thread(t).start();
         new Thread(t).start();
         new Thread(t).start();
         new Thread(t).start();

}

 

 

 

转载于:https://my.oschina.net/shanesen/blog/2992530

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值