------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

方法1:继承Thread类

继承Thread类,重写run方法,把需要被线程执行的代码写到run()方法中
public class MyThread extends Thread {@Overridepublic void run() {for (int x = 0; x < 100; x++) {System.out.println(getName() + "---" + x);}}}
     创建Thread的子类对象,调用类的start静态方法开启线程
 public static void main(String[] args) throws InterruptedException {MyThread mt = new MyThread();MyThread mt2 = new MyThread();mt.start();mt2.start();}
}
     线程的常用方法1.给线程命名public final void setName(String name)2.获取当前的线程名public final String getName()3.获取和设置线程的优先级public final int getPriority()public final void setPriority(int newPriority)4.线程加入(等待该线程终止)public final void join()5.线程礼让public static void yield()6.针对不是Thread类的子类中如何获取线程对象名称呢?public static Thread currentThread():返回当前正在执行的线程对象Thread.currentThread().getName()7.守护线程public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。

方法2:实现Runnable接口

     A:使类实现Runnable接口,重写run方法,把需要线程执行的代码写入run方法中
import java.util.Date;public class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程开始执行"+new Date());try {Thread.sleep(10000);for(int x=0;x<100;x++){System.out.println(Thread.currentThread().getName()+"---"+x);}} catch (InterruptedException e) {System.out.println("线程被终止");//e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"线程执行完毕"+new Date());}}
     B:创建类对象,以便作为参数传递C:创建Thread对象,并把B步骤的对象最为参数使用<pre name="code" class="java">   D:通过Thread对象的start方法开启线程

优点: 开启多个线程只需创建一个参数对象

public class MyThreadDemo2 {public static void main(String[] args) {MyRunnable my = new MyRunnable();Thread t = new Thread(my, "王力宏");Thread t2 = new Thread(my,"刘亦菲");t.start();t2.start();//3妙后关闭线程try {Thread.sleep(3000);t2.stop();   //改方法已经过时,该方法停止线程t.interrupt();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

方法3:利用线程池开启线程

执行原理:A:利用Executors的静态方法newFixedThreadPool(int nThreads)创建一个线程池public static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池查API可以看出,返回值ExecutorService是一个接口,所以实际返回值应该是其具体实现类B:ExecutorService的主要方法有:void shutdown()   关闭线程池<T> Future<T> submit(Callable<T> task)   提交一个返回值的任务用于执行该方法可以得到一个返回值Future<?> submit(Runnable task) 提交一个 Runnable 任务用于执行由此可知,线程池可以执行Runnable对象或者Callable对象代表的线程只需传递一个实现了该接口的实例即可

写一个实现了Callable接口的实例

import java.util.concurrent.Callable;/*需求:写一个1-n的求和线程*/
public class CallableSum implements Callable<Integer> {private int number;public CallableSum(int number) {this.number = number;}@Overridepublic Integer call() throws Exception {int sum = 0;for (int x = 1; x <= number; x++) {sum += x;}return sum;}}

再写一个实现了Runnable接口的实例

public class MyRunnable implements Runnable {@Overridepublic void run() {for(int x=0;x<100;x++){System.out.println(Thread.currentThread().getName()+":"+x);}}}
         C:调用submit方法开启线程。D:调用shutdown方法关闭线程池
public class ThreadPool {public static void main(String[] args) throws InterruptedException, ExecutionException {//创建线程池对象ExecutorService pool = Executors.newFixedThreadPool(2);//传递Runnable的实现类开启线程pool.submit(new MyRunnable());Future<Integer> f = pool.submit(new CallableSum(100));Integer i = f.get();System.out.println(i);//关闭线程池pool.shutdown();}
}

黑马程序员——多线程的实现(2+1)详解相关推荐

  1. [置顶] 黑马程序员 -- 多线程

    黑马程序员 -- 多线程 polk601001 星期五, 15/06/2012 - 17:14 发布 什么是多线程? 多线程就是使程序并发(同时)执行几个操作. .NET 框架类库在System.Th ...

  2. 好程序员技术分析JavaScript闭包特性详解

    为什么80%的码农都做不了架构师?>>>    好程序员技术分析JavaScript闭包特性详解,今天来总结一下js闭包的那些事,以及遇到的坑和解决方法,希望对你有所帮助. 是的,没 ...

  3. 程序员新动向!大龄困惑详解!

    有一批网易,搜狗,华为等知名互联网公司老员工站出来吐槽,说35岁之后的处境多么尴尬,尤其大数据.人工智能方向,如果资历不够.技术一般一般,每天在公司时刻提心吊胆,生怕被裁员. 1 为何会出现这种现象? ...

  4. 黑马程序员—————— 多线程

    java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码).java使用线程执行体来代表这段 ...

  5. 黑马程序员—多线程,单线程

    ------- Windows Phone 7手机开发..Net培训.期待与您交流! ------- 单线程与多线程比较: 单线程只能做一件事情,多线程可以做多种事情.多线程的应用,可以让一个程序同时 ...

  6. 黑马程序员——多线程

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  7. 黑马程序员 多线程

    进程:是一个正在执行中的程序. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元. 线程在控制着进程的执行. 一个进程中至少有一个线程. ...

  8. 黑马程序员——总集篇

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 本人编写技术博客的时候只是针对章节的一些比较重要的知识点来编写的: 个人感觉质量 ...

  9. 黑马程序员,黑马论坛-----多线程知识点总结

    来源:黑马程序员,黑马论坛 创建: 方式一:继承Thread类 步骤: 继承Thread覆写run( )方法 通过Thread子类创建线程对象 调用start( );方法开启线程执行run( ) 方式 ...

最新文章

  1. Aggregation,Composition和Dependency
  2. IOS 6.0+ Autolayout — UITableViewCell 高度调整
  3. nginx 做负载均衡
  4. Index Condition Pushdown Optimization
  5. poj2140---herd sums
  6. MySQL 数据库 InnoDB 和 MyISAM 数据引擎的差别
  7. 从零开始入门 K8s | 调度器的调度流程和算法介绍
  8. qt带小数点的数字串显示,Qt-自定义小数点和千位分隔符
  9. 使用CLI设置WildFly绑定地址并关闭
  10. Windows server 2012 安装exchange 2013
  11. 02-CSS基础与进阶-day4__2018-08-31-21-33-03
  12. 独家访谈N位品牌操盘手:深度揭秘品牌自播方法论
  13. CAD梦想画图中的“镜像命令”
  14. ThreeJS 骨架图显示、骨骼修改颜色
  15. 作为 CIO,构建一个商业智能 BI 分析平台应该重点关注什么?
  16. opencv3/C++ 积分图像
  17. uniapp的checkbox标签属性
  18. 腾讯30亿入股盛大游戏;财付通支付宝被罚60万;特斯拉亏损7亿美金丨价值早报
  19. 数据驱动的网络入侵检测:最新动向与研究趋势
  20. 我的梦想,我的飞翔! 南航天合2013校园招聘火热启动

热门文章

  1. 图解一致性哈希算法的基本原理
  2. swift 获取app版本号及 ios 版本号
  3. UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-1
  4. android 下载安装后 自动安装失败,安卓安装不了软件怎么办 应用安装总是失败解决方法...
  5. 深度学习笔记---卷积特征提取与池化
  6. 通过koala软件来使用less
  7. 关于python构造函数的重载
  8. 不涉及代码,来聊聊用户画像
  9. 腾讯天气的API接口
  10. 案例_IBM人力资源分析(上篇)