一,线程的属性
(1)、线程编号(ID):
- 类型:long
- 作用:用于标识不同的线程。不同的线程有不同的编号。
- 只读
- 注意事项:
线程编号只在当前的运行中是唯一的,下一次运行,该线程的编号可能会发生变化。因此不适合作为唯一标识符。 - 查看线程ID的方式:
package thread;
import java.util.Date;
public class SimpleJavaThread {
public static void main(String[] args) throws InterruptedException {
//以定义Thread子类的方式创建线程
Thread ExtendThread = new ExtendThreadDemo();
//以创建Runnable接口实例的方式创建线程
Thread RunnableThread = new Thread(new CreateRunnable());
//开始运行
System.out.println("Main:"+Thread.currentThread().getId());
System.out.println("ExtendThread:"+ExtendThread.getId());
System.out.println("RunnableThread:"+RunnableThread.getId());
}
}
(2)、名称(name)
- 类型:String
- 作用:用于区别不同的线程。默认值与线程的编号有关,默认格式为:Thread-线程号。main函数的线程名叫main。
- 可以自己设置线程名
- 注意事项:
(1)、Java运行我们将线程名设置为一样。
(2)、设置线程名可以方便我们调试代码和定位。 - 代码:
package thread;
import java.util.Date;
public class SimpleJavaThread {
public static void main(String[] args) throws InterruptedException {
//以定义Thread子类的方式创建线程
Thread ExtendThread = new ExtendThreadDemo();
//以创建Runnable接口实例的方式创建线程
Thread RunnableThread = new Thread(new CreateRunnable());
//开始运行
System.out.println("ExtendThread:"+ExtendThread.getName());
System.out.println("RunnableThread:"+RunnableThread.getName());
System.out.println("Main:"+Thread.currentThread().getName());
ExtendThread.setName("线程名");
RunnableThread.setName("线程名");
Thread.currentThread().setName("设置线程名");
System.out.println("ExtendThread:"+ExtendThread.getName());
System.out.println("RunnableThread:"+RunnableThread.getName());
System.out.println("Main:"+Thread.currentThread().getName());
}
}
(3)、线程类别(Daemon)
- 类型:Boolean
- 可读可写
- 值为true:守护线程,通常用于执行一些重要性不是很高的任务。否则为用户线程。
- 默认值:与相应线程的父线程的该属性的值相同。
- 注意:
(1)、该属性的值必须在相应线程启动之前设置。即使用setDaemon
方法应该在start
方法之前。
(2)、负责一些关键任务处理的线程不适宜设置为守护线程。
(4)、优先级(Priority)
- 类型:int
- 作用:给线程调度器的提示
- 可读可写
- 默认值:5,即普通优先级。Java提供了1~10的优先级。对于一个线程的优先级的默认值与其父线程的优先级相同。
- 注意:
(1)、一般线程的优先级为5。使用默认优先级即可
(2)、设置优先级可能会导致出现线程饥饿问题。
二、Thread类的常用方法
-
static Thread currentThread()
(1)作用:返回当前的线程对象
Object object = Thread.currentThread();
System.out.println(((Thread) object).getName());
-
void run()
作用:实现线程所需要完成的任务处理逻辑。一般由java虚拟机自己调用,自己需要做的只是重写该方法,将需要处理的任务逻辑代码放入其中。
@Override
public void run(){
System.out.println("线程一:以定义Thread子类的方式创建线程" +Thread.currentThread().getName());
}
void start()
作用:启动相应线程。
注意:该方法的返回并不表示线程已经被启动,启动是由线程调度器进行的,一个Thread的实例只能执行一次start方法,多次调用会报错。void join()
作用:等待相应线程的运行结束。
如果A线程调用B线程的join方法,那么线程A的运行会被暂停,直到线程B运行结束。
这个博客里面有挺详细的实例和讲解join方法。
javascript:void(0)static void yield
作用:暂停当前的线程
注意:
该方法的暂停效果不是绝对的,有的时候使用该方法的线程仍然可以被调用。static void sleep(long millis)
作用:休眠millis毫秒。该方法的作用有点类似于C语言的sleep函数,当然C中的sleep是使整个程序暂停多久的时间,自己没有测试过暂停一个方法但是不影响其他方法的执行,因为C语言是面向过程的,从上到下一直执行下来,前面没执行完后面不会执行。但是C语言其实是可以实现多线程的。
java中的Thread的sleep方法可以指定某个线程休眠,同时也可以使整个程序sleep休眠。