Java----多线程详解(一) (二)

2014-11-24 11:49:44 · 作者: · 浏览: 11
le{

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开始执行呢?这样做代码不就少了吗?这个问题涉及到线程的优先级和线程的并发执行,现在讲不容易理解,下面我会进行详细的讲解。

在程序中用到了线程的构造器,在前面的程序中没有直接给出,而