博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程(7)
阅读量:4031 次
发布时间:2019-05-24

本文共 3632 字,大约阅读时间需要 12 分钟。

(http://www.cnblogs.com/lwbqqyumidi/p/3804883.html)

一.线程的生命周期及五种基本状态

二. Java多线程的创建及启动

1、实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象。(推荐使用
2、继承Thread类,重写该类的run()方法。
3、使用Callable和Future接口创建线程。具体是创建Callable接口的实现类,并实现clall()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。

三. Java多线程的就绪、运行和死亡状态

就绪状态转换为运行状态:当此线程得到处理器资源;

运行状态转换为就绪状态:当此线程主动调用yield()方法或在运行过程中失去处理器资源。

运行状态转换为死亡状态:当此线程线程执行体执行完毕或发生了异常。

此处需要特别注意的是:当调用线程的yield()方法时,线程从运行状态转换为就绪状态,但接下来CPU调度就绪状态中的哪个线程具有一定的随机性,因此,可能会出现A线程调用了yield()方法后,接下来CPU仍然调度了A线程的情况。

由于实际的业务需要,常常会遇到需要在特定时机终止某一线程的运行,使其进入到死亡状态。目前最通用的做法是设置一boolean型的变量,当条件满足时,使线程执行体快速执行完毕。

(http://blog.csdn.net/jinhongliang123/article/details/7934678)

Wait sleep区别
1   wait时别的线程可以访问锁定对象
------------------调用wait方法的时候必须锁定对象
2   sleep时别的线程也不可以访问锁定对象
第九章总结
1   线程/进程的概念
2   创建和启动线程的方式
3   sleep
4   join
5   yield
6   synchronized
7   wait
8   notify/notifyAll

示例代码:(马士兵--线程)

/*范例名称: * 原文件名称: * 要点: * 1. 线程   */import java.util.*;//包含Date()public class ThreadTest {	public static void main(String[] args) {		///		//线程类_方法1		///		Runner1 r=new Runner1();//方法1		Thread t=new Thread(r);		t.start();//启动线程				///		//线程类_方法2		///		Runner2 r2=new Runner2();//方法2		r2.start();//启动线程				for(int i=0;i<15;i++){			System.out.println("Main Thread: "+i);		}				///		//线程类_sleep方法		///		MyThread thread1=new MyThread("Hello thread");		thread1.start();		try{			Thread.sleep(5000);//主线程 休眠5s		}catch (InterruptedException e) {			return;		}		//thread1.interrupt();//打断线程		thread1.shutDown();				///		//线程同步		///		TestSync test=new TestSync();		Thread t1=new Thread(test);		Thread t2=new Thread(test);		t1.setName("T1");		t2.setName("T2");		t1.start();t2.start();	}}//线程类对象_方法1 (使用Runnable接口比从Thread类继承更灵活)class Runner1 implements Runnable{	//重写run方法	public void run() {		for(int i=0;i<15;i++){			System.out.println("Runner1: "+i);		}	}}//线程类对象_方法2class Runner2 extends Thread{	//重写run方法	public void run() {		for(int i=0;i<15;i++){			System.out.println("Runner2: "+i);		}	}}//线程类对象_方法2class MyThread extends Thread{	private boolean flag=true;//通过变量结束线程比较方便		public MyThread(String threadName) {		super(threadName);//起名字	}	public void run(){		while(flag){			System.out.println("I am "+getName());			System.out.println("==="+new Date()+"===");			try{				sleep(1000);			}catch (InterruptedException e) {				return;			}		}	}	public void shutDown(){		flag=false;	}}/////线程同步class TestSync implements Runnable{	Timer timer=new Timer();	public void run(){		timer.add(Thread.currentThread().getName());	}}class Timer{	private static int num=0;		public synchronized void add(String name){//锁定当前对象;互斥	//public void add(String name){//没有锁定		num++;		try{Thread.sleep(100);}		catch(InterruptedException e){}		System.out.println(name+", 第"+num+"个使用timer的线程");	}}
运行结果:

Runner1: 0Runner1: 1Runner1: 2Runner1: 3Runner1: 4Runner1: 5Runner1: 6Runner1: 7Runner1: 8Runner1: 9Runner1: 10Runner1: 11Runner1: 12Runner1: 13Runner1: 14Main Thread: 0Main Thread: 1Main Thread: 2Main Thread: 3Main Thread: 4Main Thread: 5Main Thread: 6Main Thread: 7Main Thread: 8Main Thread: 9Main Thread: 10Main Thread: 11Main Thread: 12Main Thread: 13Main Thread: 14Runner2: 0Runner2: 1Runner2: 2Runner2: 3Runner2: 4Runner2: 5Runner2: 6Runner2: 7Runner2: 8Runner2: 9Runner2: 10Runner2: 11Runner2: 12Runner2: 13Runner2: 14I am Hello thread===Sun Dec 18 17:01:35 CST 2016===I am Hello thread===Sun Dec 18 17:01:36 CST 2016===I am Hello thread===Sun Dec 18 17:01:37 CST 2016===I am Hello thread===Sun Dec 18 17:01:38 CST 2016===I am Hello thread===Sun Dec 18 17:01:39 CST 2016===T1, 第1个使用timer的线程T2, 第2个使用timer的线程

你可能感兴趣的文章
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>