1.继承Thread类
以上方法都需要建立Thread类或它的子类的实例.Thread类的构造方法重载了八次
构造方法如下:
1.public Thread()
2.public Thread(Runnable target) //实现Runnable接口的实例,从Thread类继承的类的实例也可以作为target
3.public Thread(String name)//线程的名字,可以通过Thread类的setName()方法来设置
4.public Thread(Runnable target, String name)
5.public Thread(ThreadGroup group , Runnable target)
6.public Thread(ThreadGroup group , String name)
7.public Thread(ThreadGroup group , Runnable target , String name)
8.public Thread(ThreadGroup group , Runnable target , String name , long stackSize)
//ThreadGroup group 线程组
//long stackSize 线程栈的大小,一般默认为12KB
注:一个普通类可以通过继承Thread类来成为一个线程类,然后通过Thread类start()方法来执行线程代码,
虽然Thread类的子类可以直接实例化,但是子类必须要覆盖Thread类的run()方法才可以运行线程.
例子:
package cn.test.ThreadTest;
public class ThreadTest extends Thread{
@Override
public void run() {
System.out.println(this.getName());
}
public static void main(String[] args) {
System.out.println("当前线程:"+Thread.currentThread().getName());
ThreadTest t1 = new ThreadTest();
ThreadTest t2 = new ThreadTest();
t1.start(); //调用start()方法时,会自动调用run()方法
t2.start();
//t1.run();
t2.run();
}
}
运行结果:
当前线程:main
Thread-0
Thread-1
Thread-1
例子:
package cn.test.ThreadTest;
public class SetNameTest extends Thread{
private String who;
@Override
public void run() {
System.out.println("who为: "+this.getName()); //who参数标识当前线程
}
public SetNameTest(String who) {
super();
this.who=who;
}
public SetNameTest(String who,String name) {//name为线程的名字
super(name);
this.who=who;
}
public static void main(String[] args) {
SetNameTest t1 = new SetNameTest("thread1","这是thread1");
SetNameTest t2 = new SetNameTest("thread2");
SetNameTest t3 = new SetNameTest("thread3");
t2.setName("这是thread2");
t1.start();
t2.start();
t3.start();//t3 不是thread-2而是thread-1
}
}
运行结果:
who为这是thread1
who为这是thread2
who为Thread-1
注:start()方法前后都可以用setName()方法,但是在调用了start()方法后使用setName()方法会产生不确定(因为可能已经调用了run()方法了)
start()方法不能多次调用,否则会报错:illegalThreadStateException异常
2.实现Runnable接口:
- 将Runnable接口的类实例化
- 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法
- 通过start()方法创建线程
package cn.test.ThreadTest;
public class RunnableTest implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
RunnableTest r1 = new RunnableTest();
RunnableTest r2 = new RunnableTest();
Thread t1 = new Thread(r1,"这是r1");
Thread t2 = new Thread(r2);
t2.setName("这是Thread2");
t1.start();
t2.start();
}
}
运行结果
这是r1
这是Thread2