知识点:简单的异常处理,多线程,同步代码块
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 一个对象真的好浪费啊。
/**
* 异常处理(老师用电脑)
* @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 一个对象真的好浪费啊。
相关文章推荐
- 简单的异常处理--生成xml异常日志
- 在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理
- 从 C++ 到 Objective-C :异常处理和多线程
- MVC 验证和异常处理 开篇及简单示例
- java基础问题----Java中的异常处理机制的简单原理和应用
- 单元测试启动多线程并行处理的简单方法
- 异常处理,简单而又复杂的问题
- 详解.NET多线程异常的处理方法
- JAVA简单异常处理(main方法中的args[]命令行参数传入两个操作数)
- 简单的异常处理--生成xml异常日志
- 一些.NET对多线程异常处理技巧分享
- 一种简单的不依赖于编程语言的异常处理方法
- 未处理异常的捕获发送及简单调试(上部)
- 一些.NET对多线程异常处理技巧分享
- 在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理
- 请描述Java中异常处理机制的简单原理和应用,并说明Error与Exception有什么区别?
- .net中对异常处理的一点简单体会~~~
- Java中的异常处理机制的简单原理和应用。
- 简单了解C++、Java和C#中的异常处理
- 从一个简单的例子看UI多线程处理(基于eclipse的SWT组件)