int i;
@Override
public void run() {
try {
while (true) {
System.out.println("a" + i++);
Thread.sleep(1000);
if (i == 10) break;
}
} catch (Exception e) {
}
}
}
请仔细研究这段代码,并多次调试观察打印出来的内容,你会有更好滴理解线程的概念和多线程执行的先后顺序。
3)、通过继承Thread类创建线程
Java中创建给管理线程的虚拟CPU是java.lang.Thread类的一个实例。也可以说Thread类的对象就是一个运行代码和使用数据的虚拟CPU。多个Thread对象可以共享代码和数据。继承Thread类创建线程的方法为:创建一个新类来继承Thread类,然后再创建该类的实例。当一个类继承Thread时,它必须重载run()方法,在这里run()方法也是新线程的入口。另外它也必须调用start()方法启动新线程执行。下面是一个实例:
public class test{
public static void main(String[] str) {
//实例化一个线程
MyThread r = new MyThread();
r.start();//对run()方法进行调用
r.setPriority(5);//设置优先级
try {
for (int i = 0; i < 10; i++) {
System.err.println("b");
Thread.sleep(1000);
}
}catch (Exception e) {
}
}
}
//通过继承Thread创建线程
class MyThread extends Thread{
int i;
@Override
public void run() {
try {
while (true) {
System.out.println("a" + i++);
Thread.sleep(1000);
if (i == 10) break;
}
} catch (Exception e) {
}
}
}
请将上面的实例跟通过实现Runnable接口创建线程的实例进行对比,通过代码对比和打印内容的对比,你将会发现这两种方法的区别以及各自的优缺点。
4)、两种方法的比较
Thread类定义了很多方法可以被它的子类重载,但是只有一个方法必须被重载,那就是run()方法。这个方法也是Runnable接口所必须的。因此如果不需要重载Thread的其他方法,选择实现Runnable接口创建线程的方法是最好的。
5)、创建多线程
前面值编写了单线程和双线程,下面来创建多线程。多线程可以为系统的内存分配做一个很好的处理,缓解内存的压力。下面是一个多线程的示例:
public class test{
public static void main(String[] str) {
//创建3个线程
MyThread1 t1 = new MyThread1("第1线程");
MyThread2 t2 = new MyThread2("第2线程");
MyThread3 t3 = new MyThread3("第3线程");
t1.start();
t2.start();
t3.start();
}
}
class MyThread1 extendsThread{
String name;
public MyThread1(String threadName) {
name = threadName;
}
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println(name +":" + i);
Thread.sleep(1000);
}
} catch (Exception e) {
}
System.err.println(name + "退出");
}
}
class MyThread2 extendsThread{
String name;
public MyThread2(String threadName) {
name = threadName;
}
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println(name +":" + i);
Thread.sleep(1000);
}
} catch (Exception e) {
}
System.err.println(name + "退出");
}
}
class MyThread3 extendsThread{
String name;
public MyThread3(String threadName) {
name = threadName;
}
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println(name +":" + i);
Thread.sleep(1000);
}
} catch (Exception e) {
}
System.err.println(name + "退出");
}
}
如果你是个聪明的人,你肯定会问,为什么不只创建一个Thread类MyThread1,然后实例化3个MyThread1开始执行呢?这样做代码不就少了吗?这个问题涉及到线程的优先级和线程的并发执行,现在讲不容易理解,下面我会进行详细的讲解。
在程序中用到了线程的构造器,在前面的程序中没有直接给出,而