目录
一、和线程调度有关的方法
1.void setPriority(int newPriority) 设置线程的优先级
2.int getPriority() 获取线程优先级
package com.java.javase.Thread; public class ThreadTest08 { public static void main(String[] args) { Thread currentThread=Thread.currentThread(); System.out.println(currentThread.getName()+"线程的默认优先级是:"+currentThread.getPriority()); Thread t=new Thread(new MyThread8()); t.setName("t"); t.start(); } } class MyThread8 implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+"线程的默认优先级是:"+Thread.currentThread().getPriority()); } }
输出结果:
main线程的默认优先级是:5
t线程的默认优先级是:53.Thread.yield() 当前线程暂停一下
package com.java.javase.Thread; public class ThreadTest { public static void main(String[] args) { /** * 让位,让当前线程暂停,回到就绪状态,让给其他线程 * 静态方法:Thread.yield(); */ Thread t=new Thread(new MyRunable()); t.setName("t"); t.start(); for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+"--->"+i); } } } class MyRunable implements Runnable{ @Override public void run() { for(int i=0;i<100;i++){ // 每10个让位一次 if(i%10==0){ Thread.yield(); // 当前线程暂停一下,让给主线程 } System.out.println(Thread.currentThread().getName()+"--->"+i); } } }
4.void join() 合并线程
package com.java.javase.Thread; public class ThreadTest { public static void main(String[] args) throws InterruptedException { System.out.println("main begin"); Thread t=new Thread(new MyRunable()); t.setName("t"); t.start(); // 合并线程 t.join(); // t合并到当前线程中,当前线程受到阻塞,t线程执行直到结束,栈之间进行了协调 System.out.println("main over"); } } class MyRunable implements Runnable{ @Override public void run() { for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"--->"+i); } } }
输出结果:
main begin
t--->0
t--->1
t--->2
t--->3
t--->4
main over
二、线程同步机制
不使用线程同步机制下—模拟两个线程对同一个账户取款
账户类
package com.java.javase.ThreadSafe; /** 银行账户 */ public class Account { private String no; private double balance; public Account() { } public Account(String no, double balance) { this.no = no; this.balance = balance; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } // 提供一个取款的方法 public void withDraw(double money){ // 未使用线程同步机制 // t1和t2并发这个方法(t1和t2是两个栈,两个栈操作堆中同一个对象) double before=this.getBalance(); double after=before-money; this.setBalance(after); } }
线程类
package com.java.javase.ThreadSafe; public class AccountThread extends Thread { // 两个线程必须共享同一个账户对象 private Account act; public AccountThread(Account act){ this.act=act; } @Override public void run() { double money=5000; act.withDraw(money); System.out.println(Thread.currentThread().getName()+"对001账户取款成功 "+"剩余余额:"+act.getBalance() ); } }
测试类
package com.java.javase.ThreadSafe; publ