Java创建线程的方法有两种
两种方法分别是继承Thread类和实现Runnable接口。
- 继承Thread类
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Hello World!");}
}public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}
- 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Hello World!");}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}
两者区别在于,通过继承Thread类,可以重写Thread类中的run()方法,直接调用start()方法启动线程;而通过实现Runnable接口,需要先创建一个实现了Runnable接口的类的实例对象,在创建Thread对象时将该实例对象作为参数传入,并且该实现类必须实现run()方法。由于Java只支持单继承,因此如果已经继承了其他类,则无法使用第一种方法创建线程。
Java引入线程组
为了更好地管理和控制线程。通过将线程分组,可以更轻松地对线程进行统一管理和控制,例如一次性停止所有属于同一线程组的线程等。此外,在开发中,有时需要创建大量的线程,而这些线程可能是相关的,因此通过将它们放入同一个线程组中,可以更清晰地表达它们之间的关系。最后,线程组还可以用于安全管理,因为可以为不同的线程组设置不同的安全策略,以确保线程安全执行。
下面是一个简单的JAVA线程组应用示例:
public class ThreadGroupDemo {public static void main(String[] args) {ThreadGroup group = new ThreadGroup("testGroup"); // 创建一个名为testGroup的线程组Thread t1 = new Thread(group, new MyRunnable(), "t1");Thread t2 = new Thread(group, new MyRunnable(), "t2");Thread t3 = new Thread(group, new MyRunnable(), "t3");t1.start();t2.start();t3.start();System.out.println("Active threads in thread group: " + group.activeCount());group.list();}static class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is running.");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
在这个示例中,我们创建了一个名为“testGroup”的线程组,并向其中添加了三个线程。通过调用activeCount()
方法,可以获取线程组当前活动的线程数量。通过调用list()
方法,可以输出线程组中所有线程的相关信息。
输出结果如下:
t1 is running.
t3 is running.
t2 is running.
Active threads in thread group: 3
java.lang.ThreadGroup[name=testGroup,maxpri=10]Thread[t1,5,testGroup]Thread[t3,5,testGroup]Thread[t2,5,testGroup]
可以看到,我们创建的线程组包含了三个线程,它们都在运行中。通过list()
方法,我们可以查看线程组中包含了哪些线程,并了解每个线程的相关信息。
需要注意的是,线程组并不会影响线程本身的执行,它只是一个逻辑上的分组并提供一些管理和控制的功能。