线程:
(1)继承Thread类——在定义的线程中需重写Thread中的run方法。
通过继承Thread类定义线程的程序:
public class t1 extends Thread{
public void run()
{
System.out.println("通过继承Thread定义线程");
}
//创建线程对象:t1 xc=new t1();
}
(2)实现Runnable接口——Runnable接口中具有一个抽象的方法,在实现Runnable接口时需实现run方法。
通过实现Runnable接口定义线程的程序:
public class t2 implements Runnable{
public void run()
{
System.out.println("通过实现Runnable接口定义线程");
}
/*创建线程对象,要借助Thread类(Thread类有4个构造器,常用的是具有一个参数,
*该参数是实现Runnable接口类对象的构造器):t2 xc=new t2();Thread t=new Thread(xc);
*/创建的类对象可作为多个Thread类构造器参数,即创建了多线程。
}
启动线程:
package a;
class MyRunnable implements Runnable
{
//定义一个run线程方法
public void run()
{
System.out.println("正确启动线程");
}
}
public class t3
{
public static void main(String[] args)
{
MyRunnable mr=new MyRunnable();
Thread t=new Thread(mr);
t.start();//启动线程
}
}
在调用start方法后,就启动了线程,该线程是和main方法并列执行的线程。
线程只能被启动一次,即只能调用一次start方法,多次启动线程就会发生异常。
线程生命周期:新建/准备/运行/等待阻塞/死亡
实现Runnable接口的多线程例子:
/*
* 实现Runnable接口的类
*/
public class DoSomething implements Runnable
{
private String name;
public DoSomething(String name)
{
this.name=name;
}
public void run()
{
for(int i=0;i<5;i++)
{
for(long k=0;k<10000000;k++);//用来模拟一个非常耗时的操作
System.out.println(name+": "+i);
}
}
}
/*
* 测试Runnable类实现的多线程程序
*/
public class TestRunnable {
public static void main(String[] args)
{
DoSomething ds1=new DoSomething("黑色");
DoSomething ds2=new DoSomething("白色");
Thread t1=new Thread(ds1);
Thread t2=new Thread(ds2);
t1.start();
t2.start();
}
}
拓展Thread类实现的多线程例子:
/*
* 测试拓展Thread类实现的多线程程序
*/
public class TestThread extends Thread
{
public TestThread(String name)
{
super(name);
}
public void run()
{
for(int i=0;i<5;i++)
{
for(long k=0;k<100000000;k++);//用来模拟一个非常耗时的操作
System.out.println(this.getName()+" :"+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new TestThread("小黑");
Thread t2=new TestThread("小白");
t1.start();
t2.start();
}
}
上面两个例子,输出的结果是不一定的,for(long k=0;k<100000000;k++);用来模拟一个非常耗时的操作。