java 线程的编写

java 线程的编写

目录

一、线程的状态

1、创建

2、就绪

3.、运行

4、阻塞

5、终止

二、多线程的实现方式

1、继承Thread类,重写run方法

2、实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

3、通过Callable和FutureTask创建线程

4、通过线程池创建线程

三、线程的同步

四、线程池


一、线程的状态

线程状态流程图如下:

 

1、创建

 使用new关键字和Thread类或者其子类建立一个对象后,该线程对象就处于新建的状态。它保持这个状态直到程序start()这个线程状态。

2、就绪

当线程对象调用了start()方法后,该线程就进入了就绪状态。就绪状态的线程处于就绪队列中,要等待JVM线程调度器的调度。

3.、运行

如果就绪状态的线程获取了cpu资源,就可以执行run(),此时线程便于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态,就绪状态和死亡状态。

4、阻塞

如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入了阻塞状态。在睡眠时间已到或者获得设备资源后可以重新进入就绪状态,可以分三种:

   .等待阻塞:运行时状态中的线程执行wait()方法,是线程进入到等待阻塞状态。

  .同步阻塞:线程在获取synchronized同步锁失败(因为同步锁被其他线程占用)。

  .其他阻塞:通过调用线程的sleep()或join()发出I/O请求时,线程就进入到阻塞状态。sleep()状态超时,join()等待线程终止超时,或者I/O处理完毕,线程重新转入就绪状态。

5、终止

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

二、多线程的实现方式

1、继承Thread类,重写run方法

 继承Thead类的线程实现的步骤如下:1.继承Thead,2.重写其Thead中的run方法。代码如下:

编写线程类ThreadTest1:

public class ThreadTest1  extends Thread{
	public ThreadTest1(String name){
		//编写子类的构造方法,可缺省
		super();
		setName(name);
	}
	public void run(){
		//编写自己的线程代码
	   System.out.println("当前线程的名称: "+Thread.currentThread().getName());
	}

}

编写使用线程main类:

public class main {
	public  static void main(String[] args ){
		ThreadTest1 mThreadTest1 =new ThreadTest1("我是自定义的线程");
		mThreadTest1.start();
		System.out.println(Thread.currentThread().toString());
        
	}

}

结果如下:

Thread[main,5,main]
当前线程的名称: 我是自定义的线程
 

2、实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

实现Runnable接口来创建线程的步骤:1.编写Runable接口实现类MyRunable,重写run方法。2.创建一个MyRunnable类的一个实例myRunnable ,3.使用myRunnable 实例去创建线程,然后启动线程。代码如下:

编写线程Runable接口MyRunnable:

public class MyRunnable implements Runnable {

	public void run() {
		// TODO Auto-generated method stub
		System.out.println("通过Runnable接口实现的线程: "+Thread.currentThread().getName());
	}

}

编写使用线程main类:

public class main {
	public  static void main(String[] args ){
		//创建Runnable接口
		MyRunnable myRunnable = new MyRunnable();
		//创建线程
		Thread mThread =new Thread(myRunnable);
		mThread.setName("通过接口创建的线程");
		mThread.start();
		
		System.out.println(Thread.currentThread().toString());
        
	}

}

结果如下:

Thread[main,5,main]
通过Runnable接口实现的线程: 通过接口创建的线程

 

3、通过Callable和FutureTask创建线程

  通过Callable和FutureTask创建线程实现步骤如下:1.创建Callable接口实现类,并实现Call方法。2.创建Callable实现类的实例,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法返回值。3.使用FutureTask对象作为Thread对象的target创建并启动线程。4.调用FutureTask对象的get()来获取子线程执行结束的返回值。

Callable接口实现类MyCallable的代码:

public class MyCallable<Object> implements Callable<Object> {

	public Object call() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("通过Callable实现的线程: "+Thread.currentThread().getName());
		return null;
	}

}

创造线程的main类:

public class main {
	public  static void main(String[] args ){
		//创建Callable接口实例
		MyCallable<Object> mMyCallable = new MyCallable<Object>();
		//创建线程
		FutureTask<Object> oneTask = new FutureTask<Object>(mMyCallable);
		
		Thread mThread =new Thread(oneTask);
		mThread.setName("这是通过Callable创建的线程");
		mThread.start();
		
		System.out.println(Thread.currentThread().toString());
        
	}

}

运行结果:

Thread[main,5,main]
通过Callable实现的线程: 这是通过Callable创建的线程

 

4、通过线程池创建线程

通过线程池创建线程实现的步骤:1.编写Runable接口实现类ThreadPoolRunnable,重写run方法。2.创建线程池服务实例executorService。3.创建一个ThreadPoolRunnable类的一个实例mThreadPoolRunnable ,3.使用mThreadPoolRunnable 实例去增加线程服务。4.使用executorService.shutdown()方法关闭线程服务。

Runable接口实现类ThreadPoolRunnable的代码:

public class ThreadPoolRunnable implements Runnable{

	public void run() {
		// TODO Auto-generated method stub
		System.out.println("通过线程池方式创建的线程: "+Thread.currentThread().getName());
		
	}

}

使用线程服务的main类:

public class main {
	private static int POOL_NUM=10;
	
	public  static void main(String[] args ){
		
	    //创建线程池服务
		ExecutorService executorService = Executors.newFixedThreadPool(5);
		
		for(int i=0;i<POOL_NUM;i++){
			//创建Runnable接口实例
			ThreadPoolRunnable mThreadPoolRunnable = new ThreadPoolRunnable();
		    //给线程池添加Runnable接口实例
			executorService.execute(mThreadPoolRunnable);
		}
	    //关闭线程池
		System.out.println(Thread.currentThread().getName());
		executorService.shutdown();
	}	
}

结果运行:

通过线程池方式创建的线程: pool-1-thread-1
通过线程池方式创建的线程: pool-1-thread-2
通过线程池方式创建的线程: pool-1-thread-3
通过线程池方式创建的线程: pool-1-thread-4
main
通过线程池方式创建的线程: pool-1-thread-3
通过线程池方式创建的线程: pool-1-thread-5
通过线程池方式创建的线程: pool-1-thread-1
通过线程池方式创建的线程: pool-1-thread-2
通过线程池方式创建的线程: pool-1-thread-4
通过线程池方式创建的线程: pool-1-thread-3

 

三、线程的同步

 

四、线程池

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值