java线程知识自我总结(一)

最近时间在学习java的多线程,做一个小整理记录一下学习进度。

 

对于多线程的概念,在此就不多做解释。

第一部,就是创建一个线程类: 创建线程类一般有两种方法,一个是继承(extends)Thread类,另一个是实现(implements) Runnable接口。

 

 

//继承Thread类

public class SonThread extends Thread {
	
	@Override
	public void run() {
		//dosomething();
	}
}

//实现Runnable接口,实现Runnable接口的类必须使用Thread类的实例才能创建线程。

public class SonThread implements Runnable {
	
	@Override
	public void run() {
		//dosomething();
	}
}
 

 

 两种方法各有自己长处吧,根据实际项目中的需要而选择,要是一个类不仅要是一个线程类,而且还必须是其他一个类的子类,那么如果继承了Thread,就不能继承另外一个类了,因为java是单继承。这个时候就可以考虑实现Runnable接口。

 

当一个SonThread实例对象调用start()方法之后,则会运行run()方法。

 

 

//启动一个线程,打印消息。

public class SonThread extends Thread {
	
	@Override
	public void run() {
		for(int i=0;i<10;i++) {
			System.out.println("= =#");
		}
	}
	
	public static void main(String[] args) {
		new SonThread().start();
	}
}

 

 

 当程序执行了start()方法后,便会启动一个新线程,执行run()方法中的内容。

 

 

 

sleep()方法

 

简单的说,当一个线程调用了sleep()方法后,会“睡眠”一段时间,要“睡眠”多久由你自己来决定。

 

 

 

//隔一秒打印出一行消息

public class SonThread extends Thread {
	
	@Override
	public void run() {
		for(int i=0;i<10;i++) {
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("= =#");
		}
	}
	
	public static void main(String[] args) {
		new SonThread().start();
	}
}

 

 

在这里要注意的是,sleep()方法需要try-catch。在一个线程调用了sleep()方法后,如果在没有“醒来”前,又调用了interrupt()方法,则会抛出一个InterruptedException异常,表示被打断,则该线程会直接退出run()方法而终止运行。

 

sleep方法有两个重载形式:

 

//sleep()方法

public static void sleep(long millis)  throws InterruptedException  
public static void sleep(long millis,  int nanos)  throws InterruptedException 

 

 

  第一种是以毫秒为单位,第二种的第一个参数也是以毫秒为单位,第二个参数是以纳秒为单位。

  一般来说,用第一种就好了。

 

 

 

 

interrupt()方法

 

线程结束:第一种就是run()方法运行完毕,线程则结束。另一种是调用了中断线程的方法,如interrupt()方法,他作用就是用来中断线程。调用interrupt()可以使一个被阻塞的线程抛出一个中断异常(InterruptedException),从而使线程提前结束阻塞状态,退出堵塞代码。若是在线程运行期间调用此方法,则无效。

 

在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted()。当然,在java中,打断线程的方法不止一个,还有一个stop()方法,这个方法在java中已经被遗弃,原因是一个不安全的退出,强迫线程停止执行。举个例子,借用老马经典的话:interrupt方法,是往熟睡的人身上泼凉水,那个人就醒过来了,该干嘛干嘛去。而stop方法则是将熟睡的人一棍子给打死,一点机会也不给。 = =# 这就是强迫线程停止,如果某些线程占着一部分资源,被强制停止后,资源可能永远都释放不了。

 

 

//例子程序

import java.io.IOException;


public class SonThread extends Thread {
	
	@Override
	public void run() {
		try {
			sleep(50000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args)throws IOException {
	
		SonThread son = new SonThread();
		son.start();
		System.out.println("50秒之内,按任意键终止线程");
		System.in.read();
		son.interrupt();
	}
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值