每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新Thread
对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
join()
等待该线程终止。
join(long millis)
等待该线程终止的时间最长为
millis
毫秒。
join(long millis, int nanos)
等待该线程终止的时间最长为
millis
毫秒 +
nanos
纳秒。
Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); t1.setPriority(Thread.MAX_PRIORITY); t2.start(); // t1.join();//特点:当a线程执行到了b线程的join方法时 a就会等待 等b线程都执行完,a才会执行 //join用来临时加入线程执行。
run()
如果该线程是使用独立的
Runnable
运行对象构造的,则调用该
Runnable
对象的
run
方法;否则,该方法不执行任何操作并返回。
sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
sleep(long millis, int nanos)
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
start()
使该线程开始执行;Java 虚拟机调用该线程的
run
方法。
yield()
暂停当前正在执行的线程对象,并执行其他线程。
package thread; public class ThreadDemo { public static void main(String[] args) { //第一种方法实现: thread1 t1 = new thread1("one"); thread1 t2 = new thread1("two"); t1.start(); t2.start(); // //第二种实现方法: // thread2 t1 = new thread2("one"); // thread2 t2 = new thread2("two"); // Thread tt1 = new Thread(t1); // Thread tt2 = new Thread(t2); // tt1.start(); // tt2.start(); for(int z = 0;z<=10;z++){ System.out.println("--main---"+z); } } } //方法一 继承thread类: class thread1 extends Thread{ private String name; thread1(String name){ this.name=name; } public void run(){ for(int x=0;x<10;x++){ System.out.println(Thread.currentThread()+"="+x); } } } //方法二:实现runnable接口: class thread2 implements Runnable{ private String name; thread2(String name){ this.name=name; } public void run(){ for(int x=0;x<10;x++){ System.out.println("thread--"+name+Thread.currentThread()+"="+x); } } }
package thread; public class ThisLockDemo { public static void main(String[] args) { // Tickets0 t1 = new Tickets0(); // Tickets0 t2 = new Tickets0(); // Tickets0 t3 = new Tickets0(); // Tickets0 t4 = new Tickets0(); //第二种方法: Tickets2 t = new Tickets2(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start();//开启后不一定会先执行 try { Thread.sleep(10);//线程休眠 } catch (InterruptedException e) { e.printStackTrace(); } t.flag = false; t2.start(); } } //方式:实现runnable接口: class Tickets2 implements Runnable{ //定义票数:100张 private int tickets=100; //定义标记:使用不同的锁: boolean flag = true; //定义锁对象: Object obj = new Object(); @Override public void run() { if(flag){ while(true){//同步代码块: synchronized(obj){ if(tickets>0){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":objectLock:"+tickets--); } } } }else{ while(true){ synchronized(this){ show(); } } } } //使用this锁: 同步函数 public synchronized void show(){ if(tickets>0){ try{ Thread.sleep(10);//线程沉睡10纳秒,会产生中断异常 }catch(InterruptedException ie){ new InterruptedException("线程沉睡中,中断异常"); } System.out.println(Thread.currentThread().getName()+":thisLock:"+tickets--); } } }
package thread; public class ProduceConcumerDemo { public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r); Consumer con = new Consumer(r); Thread t1 = new Thread(pro); Thread t2 = new Thread(con); Thread t3 = new Thread(con); Thread t4 = new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); } } //共享资源: class Resource{ private String name; private int count=1; private boolean flag = false; public synchronized void set(String name){ while(flag){//当出现多个生产者和消费者时,必须循环判断标记 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name = name+"----"+(count++); System.out.println(Thread.currentThread().getName()+"....生产者"+this.name); flag = true; this.notifyAll();//唤醒本方和对方: } public synchronized void out(){ while(!flag){//当出现多个生产者和消费者时,必须循环判断标记 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"..消费者"+this.name); flag = false; this.notifyAll();//唤醒本方和对方 } } //生产者线程: class Producer implements Runnable{ private Resource res; public Producer(Resource res) { super(); this.res = res; } @Override public void run() { while(true){ res.set("+商品+"); } } } //消费者线程: class Consumer implements Runnable{ private Resource res; Consumer(Resource res){ this.res = res; } @Override public void run() { while(true){ res.out(); } } }