1. 直接使用Thread来创建

  1. package com.test.tt;
  2.  
  3. public class ThreadEx extends Thread{
  4. private int j;
  5.  
  6. public void run(){
  7. for(j=0; j<100;j++){
  8. System.out.println("当前的线程名称是:"+ getName() + " " + "当前j的值是:" + j);
  9. }
  10. }
  11.  
  12. public static void main(String[] args) {
  13. for(int h=0; h<100;h++){
  14.  
  15. if(h==20){
    //这里新建了两个Thread对象
  16. ThreadEx threadTest1= new ThreadEx();
  17. ThreadEx threadTest2= new ThreadEx();
  18. threadTest1.start();
  19. threadTest2.start();
  20. }
  21.  
  22. System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前h的值是:" + h);
  23.  
  24. }
  25.  
  26. }
  27.  
  28. }

2. 通过实现Runnable接口,并将Runnable实现对象作为Thread的Target的方式创建

注:区别于第一种方法,这里可以达到两个线程共享变量i的目的。

  1. package com.test.tt;
  2.  
  3. public class RunnableEx implements Runnable{
  4.  
  5. private int i;
  6. @Override
  7. public void run() {
  8. for(i=0; i<100;i++){
  9. System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前i的值是:" + i);
  10. }
  11.  
  12. }
  13.  
  14. public static void main(String[] args) {
  15. for(int j=0;j<100;j++){
  16. System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前j的值是:" + j);
  17. if(j==20){
  18. RunnableEx REx=new RunnableEx();
    //这里也新建了两个Thread对象,但是里面的Target是同一个Runnable实现类对象
  19. Thread thread1 = new Thread(REx, "实例1");
  20. Thread thread2 = new Thread(REx, "实例2");
  21. thread1.start();
  22. thread2.start();
  23. }
  24. }
  25.  
  26. }
  27.  
  28. }

3. 通过实现Callable接口的方式创建(这是一个具有返回值的创建方式)

注:FutureTask只能启动一个线程

  1. package com.test.tt;
  2.  
  3. import java.util.concurrent.Callable;
  4. import java.util.concurrent.FutureTask;
  5.  
  6. public class CallableEx implements Callable{
  7. @Override
  8. public Object call() throws Exception {
  9. int i =0;
  10. for(;i<1000;i++){
  11. System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前i的值是:" + i);
  12. }
  13. return i;
  14. }
  15.  
  16. public static void main(String[] args) {
  17. // TODO Auto-generated method stub
  18.  
  19. CallableEx CEx = new CallableEx();
  20. FutureTask<Integer> task = new FutureTask<Integer>(CEx);
  21.  
  22. for(int j=0;j<1000;j++){
  23. System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前i的值是:" + j);
  24. if(j==200){
  25. Thread thread1 = new Thread(task, "实例1");
  26. thread1.start();
  27. }
  28. }
  29.  
  30. try{
    //这里的get()方法可以获取到子线程的返回值,而且在执行时会中断main线程
  31. System.out.println("线程的返回值:" + task.get());
  32. }catch(Exception ex){
  33. ex.printStackTrace();
  34. }
  35. }
  36.  
  37. }

Java的多线程创建方法的更多相关文章

  1. 2017第45周一java多线程创建方法

    1. 从JDK1.5开始,Java提供了3种方式来创建,启动多线程: Ø 继承Thread类来创建线程类,重写run()方法作为线程执行体. Ø 实现Runnable接口来创建线程类,重写run()方 ...

  2. Java之多线程创建方式

    多线程的由来 我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏边听歌,怎么设计?要解决上述问题,咱们得使用多进程或者多线程来解决. 多线程的好处: ...

  3. 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】

    一.创建线程的三种方式 · 继承Thread类 · 实现Runnable接口 · 实现Callable接口 二. 线程状态 · 线程名字 getName() · 线程活动情况 isAlive() · ...

  4. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  5. JAVA之多线程的创建

    转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...

  6. java学习之创建线程方法二

    我们上一节当中讲到了创建线程的第一种方法,就是继承Thread类,覆写Thread当中的run方法,然后创建子类对象,之后调用对象的start方法启动线程.但是这种方法有一个缺陷,因为我们知道在jav ...

  7. java学习多线程之创建多线程一

    现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...

  8. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  9. Java多线程(四)java中的Sleep方法

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

随机推荐

  1. linux下修改主机名hostname方法(转载)

    查看主机名: 在终端输入hostname 永久修改 第一步:#hostname oratest 第二步:修改/etc/sysconfig/network中的hostname 第三步:修改/etc/ho ...

  2. LeetCode(83)题解: Remove Duplicates from Sorted List

    https://leetcode.com/problems/remove-duplicates-from-sorted-list/ 题目: Given a sorted linked list, de ...

  3. 功能强大的Xcode辅助工具Faux Pas:帮你找到各种隐形的bug

    本文转载至 http://www.cocoachina.com/industry/20140804/9307.html Faux Pas(Beta版下载地址)是一个Xcode辅助工具,用以检查Xcod ...

  4. EasyDarwin开源摄像机访问EasyCamera中海康摄像头语音对讲和云台控制转发实现

    转自:http://blog.csdn.net/yanzhuomin/article/details/52887311 EasyCamera中关于摄像头SDK的调用都集中在EasyCameraSour ...

  5. EasyNVR将如何能够把内网各种各样的监控摄像机对接到公网云平台

    需求 传统监控行业里面,监控客户端.服务器端,设备端都在一个内网里面,搞个电脑开个监控终端,顶多再配一个NVR做一做摄像机的录像存储.上个电视墙(个人感觉这功能除了面子工程,没啥实用的,还特费电!), ...

  6. aop学习总结一------使用jdk动态代理简单实现aop功能

    aop学习总结一------使用jdk动态代理实现aop功能 动态代理:不需要为目标对象编写静态代理类,通过第三方或jdk框架动态生成代理对象的字节码 Jdk动态代理(proxy):目标对象必须实现接 ...

  7. Windows平台,开机自动运行应用

    打开注册表编辑器(Win+R后执行regedit) 进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 新建字符串值, ...

  8. 使用JavaScript获取浏览器UserAgent

    可以在浏览器地址栏输入about:version来查看UserAgent等信息 但是在Win10系统,本人亲测,IE和Edge用这样的方式都获取不到信息 在我惯用的QQ浏览器上倒是可以获取到 为了能方 ...

  9. 虚拟化(五):vsphere高可用群集与容错(存储DRS是一种可用于将多个数据存储作为单个数据存储群集进行管理的功能)

    vsphere高级功能需要vcenter server和共享存储的支持才能实现.vsphere的高级功能有 vmotion.storage vmotion.vsphere HA.vsphere DRS ...

  10. [Spring Batch 系列] 第一节 初识 Spring Batch

    距离开始使用 Spring Batch 有一段时间了,一直没有时间整理,现在项目即将完结,整理下这段时间学习和使用经历. 官网地址:http://projects.spring.io/spring-b ...