一、通过继承Thread类创建
(1)定义Thread类的子类(arrcompare),并重写Thread的run()方法。run()方法的方法体代表了线程要完成的任务,因此把run()方法称为执行体。
(2)创建Thread子类(arrcompare)的实例对象(new arrcompare())。
(3)调用实例对象的start()方法启动线程。
package mycompare;
public class arrcompare extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for(int k=0;k<5;k++)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("k="+k);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new arrcompare().start();
}
}
输出:
k=0
k=1
k=2
k=3
k=4
或者直接写成如下形式:
package mycompare;
public class arrcompare {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
for(int k=0;k<5;k++)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("k="+k);
}
}
}.start();
}
}
二、通过继承Runnable接口
(1)定义Runnable接口的实现类(arrcompare),并实现run()方法;
(2)定义实现类的实例对象(new arrcompare),并将此实例对象作为Thread的target参数。
(3)启动Thread类的实例对象的start方法。
package mycompare;
public class arrcompare implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int k=0;k<5;k++)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("k="+k);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new arrcompare()).start();
}
}
输出:
k=0
k=1
k=2
k=3
k=4
或者直接写成
package mycompare;
public class arrcompare {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int k=0;k<5;k++)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("k="+k);
}
}
}
).start();
}
}
-------------------以下是转载部分----------------------------------
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立