文档章节

Java创建线程方式

零下三度
 零下三度
发布于 2014/06/05 18:41
字数 1001
阅读 209
收藏 22
点赞 0
评论 0

     关于线程的内容很多,非一朝一夕能够说完的,java中关于多线程的内容也不少,不要只停留在Thread类和Runnable接口的层面,但是今天简单体验Java多线程,主要围绕Thread和Runnable展开。

     1.首先明确一个概念,在java里面一个线程只能启动一次,否则会抛异常的。一个死亡的线程是没有再次独立运行的能力。

     2.线程的几种状态。

     线程包含如下几个状态:初始化、就绪、运行、阻塞、死亡。

     下面简单的描述以下这几个状态。

      初始化:创建的Thread类或者其子类对象;

      就绪:已经完成创建并且初始化的线程对象,并且已经调用start方法了,但是没有获取到运行所需的资源(如cup、内存、IO等等)。在java程序中,就是调用了start方法,但是还没有执行run方法的状态。

      运行:线程对象获取到了运行所需的资源,并且正在执行任务代码。

      阻塞:当前线程仍然是活的,也是可以运行的,但是缺少运行的条件,一旦某个事件出现,能够从当前状态转为就绪状态。(实际上,在这里描述的还是太简单了,在往后的笔记中会详细说一说这个状态包含的几种形态)

      死亡:run方法已经执行完了,不再是一个单独执行任务的线程了。我们就认为其死亡了。

     3.java中创建线程的几种方式。

     在Java里面创建线程有三种方式。具体如下:

    (1)继承Thread类

    (2)实现Runnable接口

    (3)使用Callable与Future来创建

     接下来,分别简单介绍这三种方式。

     方式一:继承Thread类。第一步,继承Thread类,第二步实现run方法。

 * step1:继承Thread类
 * step2:重写run方法
 * @author lingxiasandu
 *
 */
public class MyThread extends Thread {

	@Override
	public void run() {
	    System.out.println("MyThread is runing !");
	}
	
	public static void main(String[] args) {
		  MyThread t = new MyThread();
		  t.start();
	}

	
}

  方法二:实现Runnable接口。

public class MyThread2 implements Runnable {

	@Override
	public void run() {
		System.out.println("MyThread2 is running !");

	}
	
	public static void main(String[] args) {
		MyThread2 runable = new MyThread2();
		//和第一种方式的区别,在于启动线程时,需要依靠一个Thread对象来start
		Thread t = new Thread(runable);
		t.start();
	}

}

   第三种:是使用了concurrent包下面的Callable与Future。该种方式适合在有返回值的异步任务。

package hq.java.thread.example;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/***
 * 
 * @author lingxiansandu
 *
 */
public class MyTask implements Callable<Integer> {

	@Override
	public Integer call() throws Exception {
		System.out.println("线程名称是:"+Thread.currentThread().getName());
		System.out.println("MyTask is runing");
		return 9;
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		Callable<Integer> call = new MyTask();
		FutureTask<Integer> future = new FutureTask<Integer>(call);
		Thread t = new Thread(future,"带返回值的线程");
		t.start();
		System.out.println("线程返回值是:"+future.get());
	}

}

4.创建并启动线程常见的写法。

  在实际项目种常见的写法有以下几种:

   (1)使用匿名类的方式,适用在只有一个地方适用run方法内部的代码,复用率低的地方。

   代码如下:

new Thread(new Runnable() {
			
			@Override
			public void run() {
			  System.out.println("线程运行了!");
				
			}
		}).start();

    (2)实现Runnable接口,新增一个start方法。这种方式使用于复用率较高的地方,让使用者忽略线程内部实现,只需要调用start方法就行了。举个例子,系统在交易时发生异常的时候,向监控平台发报告,就可以使用这种方式。

public class CreateThreadExample {
    public static void main(String[] args) {
    	SendMoniter.send("1001", "转账丢失");
	}
}

class SendMoniter implements Runnable{
    private String errorMsg;
	private String tranId;
	@Override
	public void run() {
		System.out.println("报告监控平台,交易"+tranId+"有错误,错误为:"+errorMsg);
	}
	
	
	
	public static void send(String tranId,String errorMsg){
		SendMoniter moniter = new SendMoniter();
		moniter.errorMsg = errorMsg;
		moniter.tranId = tranId;
		Thread t = new Thread(moniter);
		t.start();
	}
	
}


   5.线程睡眠的两种方式。

    (1)Thread.sleep(100);

    (2) TimeUnit.MILLISECONDS.sleep(1000);//(推荐使用这种)




   




© 著作权归作者所有

共有 人打赏支持
零下三度
粉丝 8
博文 11
码字总数 13153
作品 0
朝阳
程序员
14、Java并发性和多线程-Java ThreadLocal

以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有...

easonjim
2017/06/16
0
0
Java多线程下 ThreadLocal 的应用实例

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程” 。其实,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量,也许把它命名为 ThreadLocalVariable更容易让人理解一些。...

空云万里晴
2014/01/06
0
0
InheritableThreadLocal详解

1、简介 在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分析了ThreadLocal。但由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadL...

沈渊
04/12
0
0
深入研究java.lang.ThreadLocal类

一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局...

FoxHu
2012/05/08
0
0
Spring的事务管理难点剖析(4):多线程的困惑

由于Spring的事务管理器是通过线程相关的ThreadLocal来保存数据访问基础设施(也即Connection实例),再结合IoC和AOP实现高级声明式事务的功能,所以Spring的事务天然地和线程有着千丝万缕的...

icheer
2012/07/17
0
0
ThreadLocal 基础知识

ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...

向阳而生
2015/11/21
0
0
java.lang.ThreadLocal类研究

java.lang.ThreadLocal类研究 1、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为...

SDK4
2011/09/17
0
2
tomcat 内存溢出错误记录

tomcat 内存溢出错误记录: 前提: 你的tomcat是如何启动的: 通过startup.bat方式启动直接tomcat, 或者eclipse下启动tomcat, 两种方式解决方案不同。 解决方案: 直接启动tomcat: 手动设置...

凡尘里的一根葱
2015/11/16
0
0
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
0
0
深入JDK源码之ThreadLocal类

学习JDK中的类,首先看下JDK API对此类的描述,描述如下:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程...

陶邦仁
2015/03/26
0
6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
11分钟前
11
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
17分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
41分钟前
0
0
mac Homebrew 指令积累

1通用命令 brew install [包名] //安装包 brew list //列举安装的包 brew info [包名] // 显示安装包的详细信息 mysql 相关 #启动mysql 服务 brew service start mysql my...

Kenny100120
今天
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
4
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0
将博客搬至CSDN

AHUSKY
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部