三种启动线程的方式(注:一个进程可以有多个线程)
(1) 继承Thread类
Step1:创建一个继承于Thread类的子类;
Step2:重写Thread类的run()方法,方法内实现此子线程要实现的功能;
Step3:创建一个子类的对象;
Step4:调用线程的start()方法;启动此线程,然后调用相应的run()方法
注:一个线程只能调用一次start()方法
package Thread01;
public class MyThread extends Thread {
private int i;
@Override
public void run() {
for (; i < 10; i++) {
System.out.println(getName()+"\t"+i);
}
}
}
package Thread01;
public class MyTest {
public static void main(String[] args) {
for (int i = 0; i <10; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i+"======");
if(i==5){
MyThread mt2 =new MyThread();
MyThread mt =new MyThread();
mt2.start();
mt.start();
}
}
}
public static long getMemory() {
return Runtime.getRuntime().freeMemory();
}
}
(2) 实现Runnable接口
Step1:创建一个实现Runnable接口的类;
Step2:实现接口的抽象方法;
Step3:创建一个实现Runnable接口的实现类对象;
Step4:将此对象作为形参传递给Thread类的构造器,创建Thread类的对象,此对象即为一个线程;
Step5:调用start()方法:启动线程并执行run()方法。
package Thread02;
public class SecondThread implements Runnable{
private int i;
public void run() {
for (; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20)
{
System.out.println(Thread.currentThread().getName()+"执行完毕");
}
}
}
}
package Thread02;
public class MyTest {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==5)
{
SecondThread s1=new SecondThread();
Thread t1=new Thread(s1,"线程1");
Thread t2=new Thread(s1,"线程2");
t1.start();
t2.start();
}
}
}
}
(3)实现callable接口
package Thread03;
import java.util.concurrent.Callable;
public class Target implements Callable<Integer> {
int i=0;
public Integer call() throws Exception {
for (; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+""+i);
}
return i;
}
}
package Thread03;
import java.util.concurrent.FutureTask;
public class ThirdThread {
public static void main(String[] args) {
Target t1=new Target();
FutureTask<Integer> ft=new FutureTask<Integer>(t1);
Thread t2=new Thread(ft,"新线程");
t2.start();
try {
System.out.println(ft.get());
} catch (Exception e) {
// TODO: handle exception
}
}
}