主线程
当java程序启动时,会立即运行一个线程,因为它是程序开始时执行的线程,所以这个线程通常称为程序的主线程。主线程很重要,有以下两个原因:
1.其他子线程都是从主线程产生的。
2.通常,主线程必须是最后才结束执行的线程,因为它需要执行各种关闭动作。
尽管主线程是在程序启动时创建自动创建的,但是可以通过Thread对象对其进行控制。因此,必须调用currentThread()方法获取对主线程的一个引用。该方法是Thread类的公有静态成员。
public static void main(String[] args) {
Thread thread = Thread.currentThread();
System.out.println(thread);
thread.setName("My Thread");
System.out.println(thread);
}
上面代码执行结果如下
Thread[main,5,main]
Thread[My Thread,5,main]
默认情况下主线程的名称是main,线程优先级为5,并且main也是线程所属线程组的名称。在更改了线程的名称后,再次输出t,这一次将显示线程新的名称。
线程组是将一类线程作为整体来控制状态的数据。
创建线程(继承Thread类)
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 2000; i++) {
System.out.println(i);
}
}
}
创建线程的第二种方式是创建一个扩展了Thread的新类,然后创建该类的实例。扩展类必须重写run()方法,run()方法是新线程的入口点。扩展类还必须调用start()方法以开始新线程的执行。
MyThread my1 = new MyThread("my-----------1");
MyThread my2 = new MyThread("my2");
my1.start();
my2.start();
注意MyThread类种的super方法的调用,这会给该线程指定线程名称。
run()方法和start()方法的区别
run():仅仅封装了线程的代码,直接调用相当于普通方法。
start():首先启动线程,然后jvm调用run()方法。
创建线程(实现Runnable接口)
创建线程最简单的方式是创建实现Runnable接口的类。Runnable接口抽象了一个可执行代码单元。可以依托任何实现了Runnable接口的对象来创建线程。为了实现Runnable接口,类只需要实现run()方法。
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
启动线程
new Thread(new MyRunnable(), "strMr1").start();
new Thread(new MyRunnable(), "strMr2").start();
第一个参数为:Runnable接口的实现类对象。
第二个参数为:线程名。
为什么需要有这两种方式
1.可以避免java单继承带来的局限性。
2.适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效的分离,较好的体现了面向对象的设计思想。
网友评论