文档章节

Java创建线程方式

零下三度
 零下三度
发布于 2014/06/05 18:41
字数 1001
阅读 210
收藏 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
InheritableThreadLocal详解

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

沈渊
04/12
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

没有更多内容

加载失败,请刷新页面

加载更多

科学利用谷歌云平台

当今既是大数据时代,也是云计算时代。云平台构建已经成了诸多大数据平台建设第一步。于是各家互联网巨头们纷纷都开启了云平台服务。国内的以阿里云、腾讯云、百度云、华为云为首,国外的有A...

胖胖雕
15分钟前
0
0
公众号关联小程序发送关联通知

公众号关联小程序发送关联通知,对于推广小程序有着很大的帮助。所以问题来了,怎么做到在公众号关联小程序发送关联通知呢? 一:开发中遇到的问题 之前在开发过程中发现,公众号已经关联小程...

Code辉
18分钟前
0
0
并发编程基础之JMM学习摘要

一、JMM定义 Java内存模型即Java Memory Model(JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见(内存可见性),从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程...

狠一点
23分钟前
0
0
mysql 开启日志记录并且解决日志时间错误问题

一、开启二进制日志 查看二进制日志是否开启 mysql> show variables like 'log_bin'; 编辑mysql配置文件 vi /etc/mysql/mysql.conf.d/mysqld.cnf 注意log-bin和log_bin这个坑 server-id = 1 ......

Marhal
25分钟前
0
0
Kubernetes上的负载均衡详解

如果您的应用程序是面向大量用户、会吸引大量流量,那么一个不变的目标一定是在高效满足用户需求的同时、不让用户感知到任何类似于“服务器繁忙!”的情况。这一诉求的典型解决方案是横向扩展...

RancherLabs
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部