线程的常用方法:
这里我觉得这个老师的教案总结的很舒胡(主要是懒~):
线程同步:
在处理多线程问题时,有一个Bug问题啊:当两个或多个线程同时访问一个父类变量时,并且一个线程需要修改这个变量,(一个线程让变量A增加,另一个线程让变量A减少)。
所有有线程同步。
所谓线程同步就是若干个线程都需要使用一个synchronized修饰的方法,即程序中的若干个线程都需要使用一个方法,而这个方法使用synchronized给予了修饰。
多个线程调用synchronized方法必须遵守同步机制,即一个线程在使用,其他线程需排队等待,知道该线程使用完毕。
举得例子是银行账务,同意账户可以出账和进账,符合要求。
第一步:
package com.suzhou.dajiang;
public class main {
public static void main(String[] args) {
Bank bank = new Bank();
bank.setMoney(200);
System.out.println("账上还有余额200");
Thread accountant = new Thread(bank);
accountant.setName("会计");
Thread cashier = new Thread(bank);
cashier.setName("出纳");
accountant.start();
cashier.start();
}
}
第二步:Bank类,使用runnable接口实现多线程
package com.suzhou.dajiang;
public class Bank implements Runnable{
int money;//余额
public void setMoney(int n){//设置进来
money = n;
}
@Override
public void run() {
//将进出帐区分开来
if(Thread.currentThread().getName().equals("会计")){
savaOrTake(300);
}
else if(Thread.currentThread().getName().equals("出纳")){
savaOrTake(150);
}
}
public synchronized void savaOrTake(int m){//存取钱的函数
if(Thread.currentThread().getName().equals("会计")){
for (int i=0;i<3;i++){//分开存,三次
money=money+m/3;
System.out.println(Thread.currentThread().getName()+"存入"+m/3+",账上还有"+money);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
else if(Thread.currentThread().getName().equals("出纳")){
for (int i=0;i<3;i++){
money=money-m/3;
System.out.println(Thread.currentThread().getName()+"取出"+m/3+",账上还有"+money);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
结果:
从结果上看,在存入的时候,并没有受到出纳线程的干扰;在存入结束之后,出纳开始执行,这样,余额不会受到干扰
最后,Java的多线程机制就简单学到这里啦~
真好