文档章节

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
朝阳
程序员
私信 提问
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
深入研究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

没有更多内容

加载失败,请刷新页面

加载更多

访问日志不记录静态文件、切割和静态元素过期时间

11月16日任务 11.22 访问日志不记录静态文件 11.23 访问日志切割 11.24 静态元素过期时间 1. 访问日志不记录静态文件 示例一: 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用...

hhpuppy
7分钟前
0
0
day151-2018-11-18-英语流利阅读-待学习

后双十一时代阿里将何去何从? Daniel 2018-11-18 1.今日导读 “这么便宜,我要买下来,统统都要买下来!” 这个双十一,你剁手了吗?据说阿里巴巴天猫在刚过去的双十一里单日销售额再创新高...

飞鱼说编程
13分钟前
1
0
tomcat加内存

Linux下的tomcat: 需要找到catalina.sh,在 cygwin=false 的上面一行加上: 1 JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m" Windows下解压版的tomcat ......

无知的小孩
25分钟前
0
0
POSIX正则

简介 因为之前对于POSIX类的正则表达式使用的比较少,也就没有上心去记忆,最近因为使用的比较多,就仔细的看了一下做了一个简单的总结。 表达式 \p{Lower} 小写字母字符:[a-z] \p{Upper} 大...

trayvon
今天
1
0
soapui的安装使用

https://blog.csdn.net/weiqing723/article/details/78865734

暗中观察
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部