1.创建线程
方法1:继承Thread类
public class Demo1 {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();while (true) {System.out.println("main");}}}class MyThread extends Thread {public void run() {while (true) {System.out.println("MyThread");}}
}
方法2.使用匿名内部类
public static void main(String[] args) {Thread thread = new Thread() {public void run() {while (true) {System.out.println("Thread"); }}};thread.start();while (true) {System.out.println("main");}}
方法3.使用lambda表达式
public static void main(String[] args) {Thread thread = new Thread(() -> {while (true) {System.out.println("Thread");}});thread.start();while (true) {System.out.println("mian");}}
注意,在使用lambda表达式时,若要使用外面的变量(main中的局部变量但不在lambda中的变量),则该变量不能被修改,因为使用时会触发变量捕获,由于lambda是回调函数,执行时机是很久之后(操作系统真正创建出线程后才会执行),有可能main先执行完,导致该变量在使用前就被销毁,于是该变量不能被修改。
若该变量为引用类型,则这个引用一旦指向一个对象后,就不能指向其他对象,但指向的对象本体的属性和方法能被修改。
在上述代码中,都使用了Thread来创建线程thread,再使用start()方法来启动线程,虽然thread.run()也能使程序运行,但本质上并没有创建出一个新的线程,只是普通的方法调用。
2.线程中断(终止)
使用thread.interrupt()方法可使thread线程终止运行,但该方法还会唤醒阻塞方法(如sleep),唤醒后可能会报错。
也可以直接在run方法中直接return,从而使该线程终止运行。
isInterruptrd()可以判断线程是否终止,若终止返回true。
3.线程休眠
使用sleep()方法可使当前线程自动放弃CPU资源从而使该线程停止运行,休眠时间为毫秒,使用该方法时要处理异常。
4.获取线程实例
当我们使用匿名内部类和lambda表达式时,由于thread线程还未创建,这这时要在run()方法中使用该线程的实例时,就要调用Thread.currentThread()方法来获取该线程的引用,该方法为静态方法。