#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. SQL映射文件-----MySQL关系映射【1对1,1对多,多对多】

    SSM框架下,mapper.xml 中 association 标签和 collection 标签的使用 当数据库中表与表之间有关联时,在对数据库进行操作时,就不只是针对某一张表了,需要联表查询 My ...

  2. Linux安装keepalived

    1.下载安装ipvs安装包,进行解压 http://www.keepalived.org/software/ 2.创建安装路径连接 安装环境: yum -y install openssl-devel ...

  3. 如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题.一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数,以 ...

  4. Python在线教程(廖雪峰)

    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000

  5. [spring]Bean注入——在XML中配置

    Bean注入的方式有两种: 一.在XML中配置 属性注入 构造函数注入 工厂方法注入 二.使用注解的方式注入@Autowired,@Resource,@Required 本文首先讲解在XML中配置的注 ...

  6. WebBrowser提交submit后界面不刷新的解决办法

    一个Form里有一个WebBrowser和一个Button,在Button_Click里执行 htmlDocument=WebBrowser.Document得到当前document 当htmlDoc ...

  7. 原生javascript-分享自己常用的函数

    [一]添加监听事件 addHandler:function(node,type,fn){if(node.addEventListener){ node.addEventListener(type,fn ...

  8. web前端看IE11的变化

    一.User-agent的变化 IE11的User-agent Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko IE10的U ...

  9. Algorithm2: 重复查过半数的元素

    数组中,有一个元素的值在数组中重复的个数是超过一半,获得元素超过一半的元素值 int MoreThanHalfNumber(int * arr, int n){                  in ...

  10. SQL基础整理(事务)

    事务==流程控制 确保流程只能成功或者失败,若出现错误会自动回到原点 具体的实现代码如下: begin tran insert into student values(') goto tranroll ...