最近又来复习一下java 的 Thread线程,然后把我 学习的稍微记录一下。
首先是 有两种方式可以创建线程:
1.一种是继承Thread类,直接成为Thread的子类
代码见下:
package com.unis.thread1;
public class DemoThread02 extends Thread{
public void run(){
System.out.println("DemoThread02 extends Thread");
}
}
main方法里是这样new Thread的
//demoThread02是继承成Thread 类 实现的线程
DemoThread02 demoThread02 = new DemoThread02();
使用内部类的方式new 一个Thread
//以内部类的方式创建线程
Thread thread06 = new Thread(){
public void run(){
System.out.println("Thread thread06 = new Thread(){---内部类");
}
};
thread06.start();
2.第二种是实现Runnable 接口,然后将该对象传入Thread参数中
代码如下:
package com.unis.thread1;
public class DemoRunnable04 implements Runnable{
@Override
public void run() {
System.out.println("DemoRunnable04 implements Runnable");
}
}
//demoRunnable04 是实现了 Runnable 接口
DemoRunnable04 demoRunnable04 = new DemoRunnable04();
Thread demoThread04 = new Thread(demoRunnable04);
demoThread04.start();
使用内部类的方式创建线程
//demoThread05 也为 传去 Runnable对象
Thread demoThread05 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("demoThread05---new Thread(new Runnable()");
}
});
demoThread05.start();
接下来 我们来看看线程的一个机制:
如果在main方法中依次start线程,但是打印完的顺序不一定会按照start的顺序会打印。
我在main方法中首先打印出main方法的线程名:
public static void main(String[] args) {
String currentName = Thread.currentThread().getName();
System.out.println("currentName:"+currentName);
}
结果为:
currentName:main
接下来我又在main方法中新建十个线程,一次打印线程的名称,最后打印的顺序不是按照代码的顺序执行,代码如下:
public static void main(String[] args){
//输出当前线程的线程名城
System.out.println("currentThread:"+Thread.currentThread().getName());
//创建是个线程,依次输出这些线程的名称
for(int i=0;i<10;i++){
new Thread(""+i){
public void run(){
System.out.println("thread"+ getName() + " running");
}
}.start();
}
}
打印结果如下:
currentThread:main
thread0 running
thread1 running
thread2 running
thread4 running
thread3 running
thread6 running
thread7 running
thread5 running
thread9 running
thread8 running
打印出的顺序不是完全按照1234.。。这样的顺序来的
这是为什么呢?
1号线程不一定是第一个将自己的名字输出到控制台的线程,这是因为线程是并行执行而不是顺序执行的。JVM和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。