- 线程的命名和取得
package cn.dujiang.demo;
// 线程操作类
class MyThread implements Runnable{//这是一个多线程的操作类
@Override
public void run() {
System.out.println(Thread.currentThread());
}
}
public class TestDemo {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt,"自定義線程對象").start();
mt.run();//直接調用run()方法
/*未設置名字:
* MyThread mt = new MyThread();
* new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
* 如果在实例化Thread类对象的时候没有为其设置名字,那么会自动对其
* 进行编号命名,也就是说保证线程对象的名字不重复。
* 运行结果:
* Thread[Thread-0,5,main]
* Thread[Thread-1,5,main]
* Thread[Thread-2,5,main]
* */
// +++++++++++++++++++++++++++++++++++++++++
/*設置名字:
* 運行結果:
* Thread[自定义线程A,5,main]
Thread[Thread-2,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[自定义线程B,5,main]
Thread[Thread-3,5,main]
* */
//+++++++++++++++++++++++++++++++++++++++++++
/* 由以下代码可以看出来:原来主方法main()就是一个线程,
* 那么所有在主方法上创建的线程,实际上都可以将其表示为子线程,
* 这一操作在Android上使用频繁
* MyThread mt = new MyThread();
new Thread(mt,"自定義線程對象").start();
mt.run();//直接調用run()方法
输出结果:
Thread[main,5,main]
Thread[自定義線程對象,5,main]*/
//===========================================
/*总结:通过以上代码可以发现,线程实际上一直都存在(主方法就是一个线程)
*可是进程在哪里呢?
*答:每当使用java命令解释一个程序的类的时候,对于操作系统而言,
*都相当于启动了一个新的进程,而我们的main只是这个新进程上的一
*一个子线程而已。
*
*每一个JVM启动的时候,至少启动两个线程
*1.main线程:程序的主要执行,以及启动子线程;
*2.gc线程:负责垃圾收集
* */
}
}
- 线程的休眠
package cn.dujiang.demo;
// 线程操作类
class MyThread implements Runnable{//这是一个多线程的操作类
@Override
public void run() {
//整个程序的执行速度会变慢
for (int x = 0; x < 10000; x++) {
try {
Thread.sleep(1000);//1000=1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",x =" + x);
}
}
}
public class TestDemo {
public static void main(String[] args) {
MyThread mt = new MyThread();
//默认情况下,在休眠的时候,如果设置了多个线程对象,那么所有的线程对象,将一起进入到run()
//(所谓的一起进入,实际上是因为先后顺序是太短了,但实际上有区别。)
new Thread(mt,"自定義線程對象A").start();
new Thread(mt,"自定義線程對象B").start();
new Thread(mt,"自定義線程對象C").start();
new Thread(mt,"自定義線程對象D").start();
new Thread(mt,"自定義線程對象E").start();
}
}
- 线程的优先级:
package cn.dujiang.demo;
// 线程操作类
class MyThread implements Runnable{//这是一个多线程的操作类
@Override
public void run() {
//整个程序的执行速度会变慢
for (int x = 0; x < 20; x++) {
try {
Thread.sleep(2000);//1000=1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",x =" + x);
}
}
}
public class TestDemo {
public static void main(String[] args) {
MyThread mt = new MyThread();
//默认情况下,在休眠的时候,如果设置了多个线程对象,那么所有的线程对象,将一起进入到run()
//(所谓的一起进入,实际上是因为先后顺序是太短了,但实际上有区别。)
Thread t1 = new Thread(mt,"自定義線程對象A");
Thread t2 = new Thread(mt,"自定義線程對象B");
Thread t3 = new Thread(mt,"自定義線程對象C");
//有可能优先级会提高,注意是可能
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(Thread.NORM_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
- 主线程优先级证明
package cn.dujiang.demo;
// 线程操作类
class MyThread implements Runnable{//这是一个多线程的操作类
@Override
public void run() {
//整个程序的执行速度会变慢
for (int x = 0; x < 20; x++) {
try {
Thread.sleep(2000);//1000=1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",x =" + x);
}
}
}
public class TestDemo {
public static void main(String[] args) {
//由此可知主线程的优先级
System.out.println(Thread.currentThread().getPriority());
}
}
//输出优先级有10,5,1。而以上代码的输出结果是:5
//结论:主线程属于中等优先级
总结:注意休眠,你感觉上是在休眠,其实在执行上,是有细微的先后顺序的,这也是程序经常会出错的地方,一定注意。再有,优先级,一般情况下使用不上的,优先级越高,对象越有可能先执行,注意是可能!
℃江