zoukankan      html  css  js  c++  java
  • java线程学习(一)

    1.简介

     java基础知识部分线程创建的三种方式、线程执行的样例。

     代码地址:http://git.oschina.net/blue_phantom/javaj

     包位置:package com.bluej.javaj.thread.first;

    2.创建线程

     继承Thread类、实现Runnale接口、实现Callable接口。

     1 /**
     2  * 创建线程方式一
     3  * @author xingdongjie
     4  *
     5  */
     6 class CreateThread1 extends Thread {
     7     @Override
     8     public void run() {
     9         threadHandle();
    10     }
    11     
    12     private void threadHandle(){
    13         System.out.println("---通过继承Thread:do what you want---");
    14     }
    15 }
    16 /**
    17  * 创建线程方式二
    18  * @author xingdongjie
    19  *
    20  */
    21 class CreateThread2 implements Runnable {
    22     @Override
    23     public void run() {
    24         threadHandle();
    25     }
    26     private void threadHandle(){
    27         System.out.println("---通过实现Runnable:do what you want---");
    28     }
    29 }
    30 /**
    31  * 线程创建方式三
    32  * @author xingdongjie
    33  *
    34  */
    35 class CreateThread3 implements Callable<CallableResult>{
    36     private CallableResult result;
    37     
    38     @Override
    39     public CallableResult call() throws Exception {
    40         result = new CallableResult();
    41         result.setStart(System.currentTimeMillis());
    42         
    43         threadHandle();
    44         
    45         result.setEnd(System.currentTimeMillis());
    46         result.setUserTime(result.getEnd()-result.getStart());
    47         result.setMessage("--执行成功--");
    48         
    49         return result;
    50     }
    51     
    52     private void threadHandle(){
    53         try {
    54             Thread.sleep(new Random().nextInt(10) * 1000);
    55         } catch (Exception e) {
    56         }
    57         System.out.println("---通过实现Callable:do what you want---");
    58     }
    59 }
    创建线程代码示例

    第三种方式实现Callable接口,可以返回执行结果,所以这里创建了一个CallableResult类用做执行结果类。

     1 /**
     2  * callable方式线程执行结果类
     3  * @author xingdongjie
     4  *
     5  */
     6 class CallableResult implements Serializable{
     7     private static final long serialVersionUID = 1L;
     8     
     9     private Long start;
    10     private Long end;
    11     private Long userTime;
    12     private String message;
    13     
    14     public Long getStart() {
    15         return start;
    16     }
    17     public void setStart(Long start) {
    18         this.start = start;
    19     }
    20     public Long getEnd() {
    21         return end;
    22     }
    23     public void setEnd(Long end) {
    24         this.end = end;
    25     }
    26     public String getMessage() {
    27         return message;
    28     }
    29     public void setMessage(String message) {
    30         this.message = message;
    31     }
    32     
    33     public Long getUserTime() {
    34         return userTime;
    35     }
    36     public void setUserTime(Long userTime) {
    37         this.userTime = userTime;
    38     }
    39     @Override
    40     public String toString() {
    41         return "CallableResult [start=" + start + ", end=" + end
    42                 + ", userTime=" + userTime + ", message=" + message + "]";
    43     }
    CallableResult代码示例

     3.执行线程

     创建完线程后,启动线程。方式一Thread、方式二Runnale创建的线程后执行方式相同,但是方式三Callable创建的线程执行有些不同。

     1 /**
     2      * 执行线程方式一
     3      */
     4     public static void doTread1(){
     5         CreateThread1 thread1 = new CreateThread1();
     6         new Thread(thread1).start();
     7     }
     8     
     9     /**
    10      * 执行线程方式二
    11      */
    12     public static void doThread2(){
    13         CreateThread2 thread2 = new CreateThread2();
    14         new Thread(thread2).start();
    15     }
    16     
    17     /**
    18      * 执行线程方式三
    19      */
    20     public static void doThread3(){
    21         CreateThread3 thread3 = new CreateThread3();
    22         CallableResult result=null;
    23         //可以通过2种方式执行Callable线程
    24         result =chooseOne(thread3);
    25         //result = chooseTwo(thread3);
    26         System.out.println("---线程执行结果result:"+result);
    27         
    28         
    29     }
    线程执行代码示例

    Callable线程的执行在这里有两种不同的执行方式,所以用了两个方法,使用时可以二选一。

     1 /**
     2      * 通过FutureTask方式执行线程
     3      * @param thread3
     4      * @return
     5      */
     6     public static CallableResult chooseOne(CreateThread3 thread3){
     7         CallableResult result=null;
     8         FutureTask<CallableResult> future = new FutureTask<CallableResult>(thread3);
     9         new Thread(future).start();
    10         try {
    11             result = future.get();
    12         } catch (Exception e) {
    13             e.printStackTrace();
    14         }
    15         return result;
    16     }
    17     /**
    18      * 通过线程池方式执行线程
    19      * @param thread3
    20      * @return
    21      */
    22     public static CallableResult chooseTwo(CreateThread3 thread3){
    23         CallableResult result=null;
    24         //创建一种简单的线程池
    25         ExecutorService executorService = Executors.newCachedThreadPool();
    26         Future<CallableResult> future = executorService.submit(thread3);
    27         try {
    28             result = future.get();
    29         } catch (Exception e) {
    30             e.printStackTrace();
    31         }
    32         return result;
    33     }
    执行Callable线程代码示例

    4.小结

    以上是线程创建及执行的不同方式。

      1 package com.bluej.javaj.thread.first;
      2 
      3 import java.io.Serializable;
      4 import java.util.Random;
      5 import java.util.concurrent.Callable;
      6 import java.util.concurrent.ExecutorService;
      7 import java.util.concurrent.Executors;
      8 import java.util.concurrent.Future;
      9 import java.util.concurrent.FutureTask;
     10 
     11 /**
     12  * 线程的创建及执行
     13  * @author xingdongjie
     14  *
     15  */
     16 public class CreateAndDoThread {
     17 
     18     /**
     19      * @param args
     20      */
     21     public static void main(String[] args) {
     22         //3种创建线程的执行demo
     23         //doTread1();
     24         //doThread2();
     25         doThread3();
     26 
     27     }
     28 
     29     /**
     30      * 执行线程方式一
     31      */
     32     public static void doTread1(){
     33         CreateThread1 thread1 = new CreateThread1();
     34         new Thread(thread1).start();
     35     }
     36     
     37     /**
     38      * 执行线程方式二
     39      */
     40     public static void doThread2(){
     41         CreateThread2 thread2 = new CreateThread2();
     42         new Thread(thread2).start();
     43     }
     44     
     45     /**
     46      * 执行线程方式三
     47      */
     48     public static void doThread3(){
     49         CreateThread3 thread3 = new CreateThread3();
     50         CallableResult result=null;
     51         //可以通过2种方式执行Callable线程
     52         result =chooseOne(thread3);
     53         //result = chooseTwo(thread3);
     54         System.out.println("---线程执行结果result:"+result);
     55         
     56         
     57     }
     58     /**
     59      * 通过FutureTask方式执行线程
     60      * @param thread3
     61      * @return
     62      */
     63     public static CallableResult chooseOne(CreateThread3 thread3){
     64         CallableResult result=null;
     65         FutureTask<CallableResult> future = new FutureTask<CallableResult>(thread3);
     66         new Thread(future).start();
     67         try {
     68             result = future.get();
     69         } catch (Exception e) {
     70             e.printStackTrace();
     71         }
     72         return result;
     73     }
     74     /**
     75      * 通过线程池方式执行线程
     76      * @param thread3
     77      * @return
     78      */
     79     public static CallableResult chooseTwo(CreateThread3 thread3){
     80         CallableResult result=null;
     81         //创建一种简单的线程池
     82         ExecutorService executorService = Executors.newCachedThreadPool();
     83         Future<CallableResult> future = executorService.submit(thread3);
     84         try {
     85             result = future.get();
     86         } catch (Exception e) {
     87             e.printStackTrace();
     88         }
     89         return result;
     90     }
     91 }
     92 
     93 
     94 /**
     95  * 创建线程方式一
     96  * @author xingdongjie
     97  *
     98  */
     99 class CreateThread1 extends Thread {
    100     @Override
    101     public void run() {
    102         threadHandle();
    103     }
    104     
    105     private void threadHandle(){
    106         System.out.println("---通过继承Thread:do what you want---");
    107     }
    108 }
    109 /**
    110  * 创建线程方式二
    111  * @author xingdongjie
    112  *
    113  */
    114 class CreateThread2 implements Runnable {
    115     @Override
    116     public void run() {
    117         threadHandle();
    118     }
    119     private void threadHandle(){
    120         System.out.println("---通过实现Runnable:do what you want---");
    121     }
    122 }
    123 /**
    124  * 线程创建方式三
    125  * @author xingdongjie
    126  *
    127  */
    128 class CreateThread3 implements Callable<CallableResult>{
    129     private CallableResult result;
    130     
    131     @Override
    132     public CallableResult call() throws Exception {
    133         result = new CallableResult();
    134         result.setStart(System.currentTimeMillis());
    135         
    136         threadHandle();
    137         
    138         result.setEnd(System.currentTimeMillis());
    139         result.setUserTime(result.getEnd()-result.getStart());
    140         result.setMessage("--执行成功--");
    141         
    142         return result;
    143     }
    144     
    145     private void threadHandle(){
    146         try {
    147             Thread.sleep(new Random().nextInt(10) * 1000);
    148         } catch (Exception e) {
    149         }
    150         System.out.println("---通过实现Callable:do what you want---");
    151     }
    152 }
    153 /**
    154  * callable方式线程执行结果类
    155  * @author xingdongjie
    156  *
    157  */
    158 class CallableResult implements Serializable{
    159     private static final long serialVersionUID = 1L;
    160     
    161     private Long start;
    162     private Long end;
    163     private Long userTime;
    164     private String message;
    165     
    166     public Long getStart() {
    167         return start;
    168     }
    169     public void setStart(Long start) {
    170         this.start = start;
    171     }
    172     public Long getEnd() {
    173         return end;
    174     }
    175     public void setEnd(Long end) {
    176         this.end = end;
    177     }
    178     public String getMessage() {
    179         return message;
    180     }
    181     public void setMessage(String message) {
    182         this.message = message;
    183     }
    184     
    185     public Long getUserTime() {
    186         return userTime;
    187     }
    188     public void setUserTime(Long userTime) {
    189         this.userTime = userTime;
    190     }
    191     @Override
    192     public String toString() {
    193         return "CallableResult [start=" + start + ", end=" + end
    194                 + ", userTime=" + userTime + ", message=" + message + "]";
    195     }
    196     
    197 }
    所有代码示例
  • 相关阅读:
    WebSocket
    使用fiddler将网站上的css js重定向至本地文件
    chrome浏览器调试线上文件映射本地文件
    xul 创建一个按钮
    模板小程序】求小于等于N范围内的质数
    哈希-------开放寻址法-------暴雪哈希
    建造者模式(build pattern)-------创造型模式
    抽象工厂模式(abstract factory pattern)------创造型模式
    工厂模式(factory pattern) ------创造型模式
    文件名中含有连续字符abc,相应文件中也含有字符串abc
  • 原文地址:https://www.cnblogs.com/bluej/p/6520666.html
Copyright © 2011-2022 走看看