#Java多线程实现的3中方式
1.继承Thread类实现多线程
    这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
  1. public class MyThread extends Thread {
  2. public void run() {
  3.    System.out.println("MyThread.run()");
  4.   }
  5. }
    启动线程代码:
  1. MyThread myThread1 = new MyThread();
  2. MyThread myThread2 = new MyThread();
  3. myThread1.start();
  4. myThread2.start();
 
2.实现Runnable接口方式实现多线程
    如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口。
  1. public class MyThread extends OtherClass implements Runnable {
  2. public void run() {
  3.    System.out.println("MyThread.run()");
  4.   }
  5. }
    为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例
  1. MyThread myThread = new MyThread();
  2. Thread thread = new Thread(myThread);
  3. thread.start();
 
3.使用ExecutorService、Callable、Future实现又返回结果的多线程
    ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。 Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,ExecutorsExecutorService,CompletionService,Future,Callable等。并发  编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor  执行,Executor.execute(Runnalbe) 。Executor在执行时使用内部的线程池完成操作。 有返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行  Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返  回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。
 
  1. import java.util.concurrent.*;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.ArrayList;
  5. /**
  6. * 有返回值的线程
  7. */
  8. @SuppressWarnings("unchecked")
  9. public class Test {
  10. public static void main(String[] args) throws ExecutionException,
  11. InterruptedException {
  12. System.out.println("----程序开始运行----");
  13. Date date1 = new Date();
  14. int taskSize = 5;
  15. // 创建一个线程池
  16. ExecutorService pool = Executors.newFixedThreadPool(taskSize);
  17. // 创建多个有返回值的任务
  18. List<Future> list = new ArrayList<Future>();
  19. for (int i = 0; i < taskSize; i++) {
  20. Callable c = new MyCallable(i + " ");
  21. // 执行任务并获取Future对象
  22. Future f = pool.submit(c);
  23. // System.out.println(">>>" + f.get().toString());
  24. list.add(f);
  25. }
  26. // 关闭线程池
  27. pool.shutdown();
  28. // 获取所有并发任务的运行结果
  29. for (Future f : list) {
  30. // 从Future对象上获取任务的返回值,并输出到控制台
  31. System.out.println(">>>" + f.get().toString());
  32. }
  33. Date date2 = new Date();
  34. System.out.println("----程序结束运行----,程序运行时间【"
  35. + (date2.getTime() - date1.getTime()) + "毫秒】");
  36. }
  37. }
  38. class MyCallable implements Callable<Object> {
  39. private String taskNum;
  40. MyCallable(String taskNum) {
  41. this.taskNum = taskNum;
  42. }
  43. public Object call() throws Exception {
  44. System.out.println(">>>" + taskNum + "任务启动");
  45. Date dateTmp1 = new Date();
  46. Thread.sleep(1000);
  47. Date dateTmp2 = new Date();
  48. long time = dateTmp2.getTime() - dateTmp1.getTime();
  49. System.out.println(">>>" + taskNum + "任务终止");
  50. return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
  51. }
  52. }
#Java多线程实现的3中方式
线程状态:
1.新状态:线程对象已经创建,还没有在其上调用start( )方法。
2.可运行状态:当start( )方法调用时,线程首先进入可运行状态。此时线程有资格运行,但是程序还没把它选定为运行线程时线程所处的状态。
3.运行状态:线程调度程序从可运行池中选择一个线程作为当前线程所处的状态。
4.等待/阻塞/睡眠状态:线程仍旧是活的,但是当前没有条件运行。如果出现某事件,它可能返回到可运行状态。
5.死亡状态:当线程的run( )方法完成时就认为它死去。这个线程对象可能是活的,但是它已经不是一个单独执行的线程。线程一旦死亡就不能复生。如果在一个死去的线程中调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
 
线程让步和线程优先级
1.线程的让步是通过Thread.yield()来实现的。yield()方法的作用是:暂停当前正在执行的线程对象,并执行其他线程。可以通过setPriority(int newPriority)更改线程的优先级。例如:
        Thread t = new MyThread();
        t.setPriority(8);
        t.start();
线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:static int MAX_PRIORITY  线程可以具有的最高优先级。 static int MIN_PRIORITY  线程可以具有的最低优先级。 static int NORM_PRIORITY 分配给线程的默认优先级。
2.Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:
        Thread t = new MyThread();
        t.start();
        t.join();

Java 多线程 2015/9/21的更多相关文章

  1. Java最重要的21个技术点和知识点之JAVA多线程、时间处理、数据格式

    (四)Java最重要的21个技术点和知识点之JAVA多线程.时间处理.数据格式  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能 ...

  2. Rhythmk 一步一步学 JAVA (21) JAVA 多线程

    1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable ...

  3. java 多线程 一个博客

    http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...

  4. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  5. Java多线程系列目录(共43篇)

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...

  6. java多线程系类:JUC线程池:03之线程池原理(二)(转)

    概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...

  7. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...

  8. java多线程系类:JUC锁:01之框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...

  9. java多线程系类:JUC原子类:03之AtomicLongArray原子类

    概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...

随机推荐

  1. mybatis的操作数据库基础

    1.domain类 package com.xiaostudy.mybatis.domain; /** * @desc domain类 * @author xiaostudy * */ public ...

  2. LCS最长共同子序列

    2017-09-02 15:06:57 writer:pprp 状态表示: f(n,m)表示s1[0..n]和s2[0..m]从0开始计数,最终结果是f(N-1,M-1)考虑四种情况: 1/ s1[n ...

  3. codeforces 1A - math - ceil

    2017-08-24 15:42:30 writer: pprp 感觉自己好菜啊,这个题都没有做的很好 题意很简单,用a * a 的地砖,将 n * m 的地板铺满,问最少需要多少个地砖? 一开始打算 ...

  4. GEO--工具 ScanGEO

    http://scangeo.dartmouth.edu/ScanGEO/ ScanGEO - parallel mining of high-throughput gene expression d ...

  5. 获取远程html

    /// <summary> /// 获取远程html /// </summary> /// <param name="url"></par ...

  6. vue-cli background iamge

    vue-cli 可以将图片直接放在项目生成的 static 文件夹里,然后在components里面直接采用绝对路径去取就可以了. 在根目录里面都会有一个static目录,这个是用来存放静态文件的,把 ...

  7. Java循环跳转语句之 continue

    continue 的作用是跳过循环体中剩余的语句执行下一次循环. 例如,打印 1--10 之间所有的偶数,使用 continue 语句实现代码为: 运行结果: continue与break的区别就是, ...

  8. are only available on JDK 1.5 and higher

    根本原因是项目中的一些配置包括jar包什么的根当前jdk版本(我刚开始用的是1.8的,好像是不支持低版本的springjar包),反正正确的思路是更改jdk版本是最合理的,叫我去把所有spring版本 ...

  9. HDU 5698 大组合数取模(逆元)

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  10. express中的错误处理

    错误处理 定义错误处理中间件和定义其他中间件一样,除了需要 4 个参数,而不是 3 个,其格式如下 (err, req, res, next).例如: app.use(function(err, re ...