线程的创建方式
一、继承Thread类,重写run()方法
public class ThreadTest extends Thread{
@Override
public void run() {//重写的run()方法,该方法声明此线程需要执行的操作
for(int i=1;i<10;i++) {
System.out.println(i);
}
}
}
//测试类中调用start()方法启动线程
public static void main(String[] args){
ThreadTest t1 = new ThreadTest();
t1.start();
}
二、实现Runnable接口,重写run()方法
public class ThreadTest implements Runnable{
@Override
public void run() {
for(int i=1;i<100;i++) {
System.out.println(i);
}
}
}
//创建一个实现Runnable接口的实例。将该实例作为形参传递给Thread构造器,通过Thread类的实例调用start()方法开启线程
public static void main(String[] args){
ThreadTest t1 = new ThreadTest();
Thread t = new Thread(t1);
t.start();
}
以上两种方式优先选用实现Runnable接口的方法,因为实现Runable接口的方式没有单继承的局限性,适合处理多个线程有共享数据的情况。
三、实现Callable接口,重写Call()方法
Callable可以在任务结束的时候提供一个返回值,Runnable无法提供这个功能
Callable的call方法分可以抛出异常,而Runnable的run方法不能抛出异常。
Callable是支持泛型的
四、采用线程池方式
创建多个线程,等到要用的时候就去线程池中取,用完又放回线程池,避免了频繁的创建线程,节省资源
三,四两种创建线程的方式为JDK1.5新增
一些相关方法
Thread类中的相关方法
1.start():启动当前线程,调用当前线程run()方法
2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
3.currentThread():获得当前线程
4.getName():获得线程的名字
5.setName():设置线程的名字
6.yield():释放当前cpu的执行权
7.join():在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b执行完以后,线程a才结束阻塞状态
8.stop():强制结束线程,已被淘汰,不推荐使用
9.sleep():让当前线程睡眠指定的毫秒数,在指定的毫秒数内都是处于阻塞状态,sleep()使用会抛异常,需要处理try-catch
10.isAlive:判断线程是否存活
Object中相关方法
wait():调用此方法,让线程等待,在此过程中,线程会释放锁,并且需要调用notify()或notifyAll()唤醒
notify():唤醒当前被wait()的线程
notifyAll():唤醒所有在等待的线程