一、通过继承Thread类来创建线程(java.lang)
通过创建一个继承Thread类的类来创建线程实例,该类必须重写 run() 方法,所有线程的启动必须调用start() 方法才可以启动。
package yyzc;
public class ThreadDemo extends Thread {
private String threadName;
ThreadDemo( String name) {
//使用super调用父类的Thread(String name)构造方法,同时传递参数。super必须写在方法的首行。
//如果这里写super(),则调用的是父类中的Thread(String name)方法。
super(name);
this.threadName=name;
System.out.println("Creating " + name );
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1; i < 100; i++) {
System.out.println("Thread: " + threadName + ", " + i);
// 让线程睡眠一会
try {
Thread.sleep(1000); //单位毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
main
package yyzc;
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread.currentThread().setName("Main");
Thread th1=new ThreadDemo("thread1");
th1.start();
for(int i = 1; i < 30; i++) {
System.out.println("Thread main " + i);
// 让线程睡眠一会
try {
Thread.sleep(1000); //单位毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("main线程结束");
}
}
以上程序运行会生成两个线程运行,thread1线程和main线程,这两个线程之间互相不影响
当main线程在运行的时候,jstack pid会显示出main线程的信息,当main线程结束的时候,jstack pid 就不会显示main线程的信息;main线程会先于thread1线程结束,但是不会影响thread1线程运行,thread1会继续运行
二、通过实现 Runnable 接口来创建线程(java.lang)
创建一个线程,最简单的方法是创建一个实现java.lang.Runnbale接口的类,该接口中只定义了一个函数 void run() ,该类必须实现该函数。run()函数类似与main()函数,可以在run函数中定义变量,引用其他类。
package yyzc;
public class RunnableDemo implements Runnable {
//指定类名
private String threadName;
RunnableDemo (String threadName ){
this.threadName=threadName;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1; i < 100; i++) {
System.out.println("Runnable-thread: " + threadName + ", " + i);
// 让线程睡眠一会
try {
Thread.sleep(1000); //单位毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
main
package yyzc;
public class Main {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Thread.currentThread().setName("Main");
Thread th1=new Thread(new RunnableDemo("hello"),"hello");
th1.start();
}
}