Java创建线程方式
Java创建线程方式
零下三度 发表于4年前
Java创建线程方式
  • 发表于 4年前
  • 阅读 188
  • 收藏 22
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 在Java中: 1.线程不可复用 2.线程的几种状态 3.创建线程的方式 4.线程睡眠的两种方式

     关于线程的内容很多,非一朝一夕能够说完的,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);//(推荐使用这种)




   




标签: Java Thread
共有 人打赏支持
粉丝 9
博文 11
码字总数 13153
×
零下三度
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: