1.线程的命名与取得
- 因为线程会根据自己的情况进行资源的抢占,所以每一次的运行结果都是不相同的.如果需要区分每一个线程就必须依靠线程的名字.一般线程的名字会在线程启动之前进行定义.不建议对已经启动的线程进行更改名称,或者对不同的线程设置重名的情况
1.线程名称操作使用Thread类的如下方法.
- 构造方法: public Thrad(Runnable target , String name){};
- 设置名字: public final void setName(String name);
- 取的名字: public final String getName();
- 出现的问题,这些方法是属于Thread类的,如果换回线程主类(即Runnable接口的子类),线程主类里面并没有继承Thread类,如果想要取得线程名字,那么能够取得的就是当前执行本方法的线程名字.所以在Thread类里面提供了一个方法;
- 取得当前线程对象: public static Thread currentThread();
- Thread.currentThread().getName();获取线程名字.如果再实例化Thread类对象没有为其设置名字,那么会自动进行编号命名保证线程对象名字不重复.(直接调用run();方法会输出主线程方法名 main)
- 主方法相对于主线程,在主方法上创建的线程实际上都可以将其表示为子线程.
- 使用java命令去解释一个程序类的时候,对于操作系统而言,都相当于启动了一个新的进程.而main相当于新进程里的一个子线程而已.
2.每一个JVM进程启动的时候至少启动几个线程??
- main 线程: 程序的主要执行,以及启动子线程;
- gc 线程 : 负责垃圾收集;
2.线程的休眠
- 休眠方法 : public static void sleep(long millis) throws InterruptedException;(打断休眠会出现中断异常InterruptedException)
- 每一次执行到run();方法的线程对象都必须进行休眠,所以执行速度会变慢.
- 默认情况下在休眠的时候如果设置了多个线程对象,那么所有的线程对象将一起进入run();方法.(实际是有区别,所谓一起进入是由于时间太多了所以会感觉是一起进行,正因为有这细微的先后差别有可能造成数据的错误;)
3.线程优先级
优先级是指优先级越高,越有可能先执行,在Thread类中提供了以下两个方法
- 设置优先级: public final void setPriority(int newPriority);
- 取得优先级: public final int getPriority();
- 设置和取得优先级都是使用了int数据类型,对于此内容有三种取值;
- 最高优先级: public static final int MAX_PRIORITY , 10;
- 中等优先级: public static final int NORM_PRIORITY , 5;
- 最低优先级:public static final int MIN_PRIORITY , 1;
- 主线程的优先级是中等优先级.
总结:
1.Thread.currentThread 可以取得当前线程类的执行对象.
2.Thread.sleep()主要是休眠,感觉是一起休眠,实际上是有先后顺序的,
3.优先级越高的对象,越有可能先执行.