zoukankan      html  css  js  c++  java
  • Java新建线程的3种方法

    Java新建线程的3种方法

    ===================

    Java创建线程有3种方法:
    (1)继承Thread;
    (2)实现Runnable接口;
    (3)实现Callable接口;

    由于Java只支持单继承,所以用继承的方式创建线程,比较死板,不够灵活;用实现接口的方式创建线程,可以实现多个接口,比较灵活。
    Runnable和Callable接口的区别:
    (1)Callable重写的方法是call(),Runnable重写的方法是run();
    (2)Callable的任务执行后可返回值,而Runnable不能返回值;
    (3)call方法可以抛出异常,run()不可以;
    (4)运行Callable任务可以拿到一个future对象,表示异步计算的结果,
    它供检查计算是否完成的方法,以等待计算完成,并检索计算的结果。通过Future对象可以了解任务的执行情况,可取消任务的执行,还可以获取执行的结果。

     

     

    1.继承Thread

    [java] view plain copy
     
     
     
    1. package com.java.thread;  
    2.   
    3. public class ThreadClient {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Print p1 = new Print();  
    7.         Print p2 = new Print();  
    8.         p1.start();  
    9.         p2.start();  
    10.   
    11.     }  
    12.   
    13. }  
    14.   
    15. class Print extends Thread{  
    16.     @Override  
    17.     public void run(){  
    18.         for(int i=0;i<10;i++){  
    19.             System.out.println(Thread.currentThread().getName()+":"+i);  
    20.             try {  
    21.                 Thread.sleep(2000);  
    22.             } catch (InterruptedException e) {  
    23.                 e.printStackTrace();  
    24.             }  
    25.         }  
    26.     }  
    27. }  

    2.实现Runnable接口

    /** 

     *    (1): 创建一个类,让该类实现Runnable接口

     *    (2): 重写run方法

      *    (3): 创建该类的对象

      *    (4): 创建Thread类的对象,然后把3中的对象作为参数传递给Thread

      *    (5): 启动线程

      */

    [java] view plain copy
     
     
     
    1. package com.java.thread;  
    2.   
    3. public class ThreadClient1 {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Runnable p1 = new Salesman("Jack");  
    7.         Runnable p2 = new Salesman("Iris");  
    8.           
    9.         Thread t1 = new Thread(p1);  
    10.         Thread t2 = new Thread(p2);  
    11.           
    12.         t1.start();  
    13.         t2.start();  
    14.     }  
    15.   
    16. }  
    17.   
    18. class Salesman implements Runnable{  
    19.       
    20.     private int ticket=100;//每个线程都拥有100张票  
    21.     private String name;  
    22.     Salesman(String name){  
    23.         this.name=name;  
    24.     }  
    25.       
    26.     @Override  
    27.     public void run(){  
    28.         while(ticket>0){  
    29.              System.out.println(ticket--+" is saled by "+name+","+Thread.currentThread().getName());  
    30.             try {  
    31.                 Thread.sleep(1000);  
    32.             } catch (InterruptedException e) {  
    33.                 e.printStackTrace();  
    34.             }  
    35.          }  
    36.     }  
    37. }  

     

    3.实现Callable接口

    [java] view plain copy
     
     
     
    1. package com.java.thread;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5. import java.util.concurrent.Callable;  
    6. import java.util.concurrent.ExecutionException;  
    7. import java.util.concurrent.ExecutorService;  
    8. import java.util.concurrent.Executors;  
    9. import java.util.concurrent.Future;  
    10.   
    11. public class CallType {  
    12.       
    13.     public static void main(String[] args) {  
    14.         ExecutorService es = Executors.newCachedThreadPool();  
    15.         List<Future<String>> results = new ArrayList<Future<String>>();  
    16.         for(int i=0;i<5;i++){  
    17.             results.add(es.submit(new TaskWithResult(i)));  
    18.         }  
    19.           
    20.         for(Future<String> fs : results){  
    21.             try {  
    22.                 System.out.println(fs.get());  
    23.             } catch (InterruptedException | ExecutionException e) {  
    24.                 // TODO Auto-generated catch block  
    25.                 e.printStackTrace();  
    26.             }  
    27.         }  
    28.     }  
    29. }  
    30.   
    31. class TaskWithResult implements Callable<String>{  
    32.     private int id;  
    33.     public TaskWithResult(int id){  
    34.         this.id = id;  
    35.     }  
    36.     @Override  
    37.     public String call() throws Exception {  
    38.         return "result of TaskWithResult" + id;  
    39.     }  
    40. }  

     

    4.匿名内部类

    /**  使用匿名内部类的方式实现 很少见

      *  new 类名/接口名() {

      *      方法重写 ;

      *   } ;

      */

    public class Thread4 {
    public static void main(String[] args) {
    //匿名实现多线程
    //继承thread类
    new Thread(){
    public void run(){
    for(int x=0;x<111;x++){
    System.out.println(getName()+":"+x);
    }
    }
    }.start();
    //实现runable
    new Thread(new Runnable() {

    @Override
    public void run() {
    for(int x=0;x<100;x++){
    System.out.println("wwww");
    }

    }
    }).start();
    }
    }

     

  • 相关阅读:
    计算机 ------- 网络基础
    设计模式------单例模式
    svn 客户端查看用户名和密码
    Docker:DockerFile(DockerFile解析)
    Docker:容器数据卷(命令方式、DockerFile方式)
    SpringBoot再总结
    Docker:镜像(镜像原理)
    Docker:Docker命令(帮助命令、镜像命令、容器命令)
    Docker(Docker的概念与安装)
    ZooKeeper:zookeeper的常用命令(节点的新增、更新、删除)
  • 原文地址:https://www.cnblogs.com/panchanggui/p/9664370.html
Copyright © 2011-2022 走看看