文档章节

Java创建线程方式

零下三度
 零下三度
发布于 2014/06/05 18:41
字数 1001
阅读 213
收藏 22

     关于线程的内容很多,非一朝一夕能够说完的,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
朝阳
程序员
私信 提问
Java多线程下 ThreadLocal 的应用实例

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

空云万里晴
2014/01/06
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
115个Java面试题及回答

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

Yamazaki
2014/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 以后我偷小鱼干养你

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @庞巴哥 :只有这节奏瞬间变得轻松。。。。。。。。。分享Talking Eyes的单曲《In the sun (Extended Version)》: 《In the sun (Extended Ve...

小小编辑
今天
3
0
多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
7
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
10
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
9
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部