您的位置:首页 > 编程语言

知识点:简单的异常处理,多线程,同步代码块

2014-08-04 19:11 337 查看
这里先写简单的异常处理,后面的代码会有更为复杂的。多线程与同步代码块也会有升级版。

/**

 * 异常处理(老师用电脑)

 * @author Administrator

 *

 */

class Teacher {

 private String name;

 public Computer computer;

 

 Teacher(String name){

  this.name = name;

  this.computer = new Computer();

 }

 

 void talk() throws Keshi{

  try {

   computer.use();

  }

  catch(LanPing e) {

   computer.reset();

  }

  catch(MaoYan e) {

   System.out.println("课时无法完成"+e.toString());

   throw new Keshi("课时无法完成");

  }

  

 }

}

class Computer {

 private int state = 3;//正常情况为1

 

 Computer() {

  System.out.println("电脑运行了");

 }

 

 void use() throws LanPing,MaoYan{

  if(state == 2) {

   throw new LanPing("蓝屏了");

  }

  if(state == 3) {

   throw new MaoYan("冒烟了");

  }

 }

 

 void reset(){

  System.out.println("电脑重启了");

 }

}

class LanPing extends Exception {

 LanPing(String str){

  super(str);

 }

}

class MaoYan extends Exception {

 MaoYan(String str){

  super(str);

 }

}

class Keshi extends Exception {

 private String str;

 Keshi(String str){

  super(str);

 }

}

public class Text4 {

 public static void main(String args[]) {

  Teacher t = new Teacher("何老师");

  try{

   t.talk();

  }

  catch(Keshi e){

   System.out.println("换老师");

  }

 }

}

思考与感悟:这里其实主要的知识点是,把调用方识别的异常抛出去。其实我也没感觉说对方不认识的异常抛出去就会怎么样。我觉得可能就是一种思想吧。但我没发现必要性。

 

/**

 * 多线程实现同步 卖票系统

 * @author Administrator

 *

 */

class Ticket implements Runnable{

 public int ticket = 100;

 public Object obj = new Object();

 public void run() {

  while(true) {

   synchronized(obj) { //同步代码块,用obj对象里的标志位来只让一个线程执行代码块

    if(ticket > 0) {

     try{Thread.sleep(10);}catch(Exception e) {}

     System.out.println(Thread.currentThread().getName()+ticket--);

    }

   }

  }

 }

 

 public synchronized void show() {//用this作为标志

  if(ticket > 0) {

   try{Thread.sleep(10);}catch(Exception e) {}

   System.out.println(Thread.currentThread().getName()+ticket--);

  }

 }

}

public class Text5 {

 public static void main(String args[]) {

  Ticket t = new Ticket();

  Thread t1 = new Thread(t);

  Thread t2 = new Thread(t);

  

  t1.start();

  t2.start();

 }

}

思考与感悟:

多线程之前自己有自学过,但没有老师讲得这么透。

多线程就是公用资源很容易出错。在利用到公用资源的代码的前面加同步synchronized关键字就OK了。当然不能在run方法前面加同步标示。线程运行的就是run方法,如果每个run方法每次只能执行一个线程,那不就变成单线程了。就是这关键字synchronized不好记。

还有就是同步代码块的标示,我们需要用一个标示来分辨这个段同步代码是否是空闲的。就用约定俗成的this就好了,因为方便。其实用其他对象也是可以的。只是有时候为了一个标示还要另外new 一个对象真的好浪费啊。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息