果然,学的太少,写博客也没什么动力,总希望能做些“大事”,羽翼却还未长成,来复习下多线程吧。
1.内部类和外部类之间的访问规则? |
2.如果内部类非私有,如何创建内部类? |
3.如何访问静态内部类中的非静态方法和静态方法? |
4.如果内部类中定义了静态成员,内部类可以不是静态的吗? |
5.外部类中的静态方法可以访问非静态内部类吗? |
6.什么是局部内部类?定义局部内部类需要遵循哪些规则? |
7.定义匿名内部类的前提?请写出一个匿名内部类。 |
8.Error类和Exception类的区别? |
9.如果方法声明了多个异常,如何处理? |
10.RuntimeException和它的子类有什么特殊性? |
11.throws和throw的区别? |
12.如果父类方法抛出异常,那么子类定义覆盖父类的方法需要注意什么? |
13.finally中的代码块什么情况不会被执行? |
14.创建线程有哪两种方法? |
15.如何获取当前线程对象? |
16.同步的前提是什么? |
17.同步的弊端是什么? |
18.静态方法和非静态方法默认持有的锁是什么? |
练习: |
4.请写出一个死锁程序。 |
1.内部类可以访问外部类的成员,包括私有,通过 外部类名.this.成员名 访问; | |||||||||
外部类要访问内部类需要建立内部类的对象 | |||||||||
2.Outer.Inner in=new Outer().new Inter()可以创建内部类对象, | |||||||||
但是一般内部类会被外部类私有化 | |||||||||
3.非静态new Outer.Inner().funtion();静态Out.Inner.function(); | |||||||||
4.不可以 | |||||||||
5.不可以,内部类作为外部类的成员之一,静态方法只能访问静态成员。 | |||||||||
6.定义:在外部类的方法中定义内部类。 内部类被定义在局部时,不可以被成员修饰符修饰, | |||||||||
不能访问它所在的局部中的非final修饰的局部变量 | |||||||||
7.定义匿名内部类的前提:内部类必须是一个类或者实现接口 | |||||||||
new AbsDemo(){ | |||||||||
void show(){ | |||||||||
System.out.println(" "); | |||||||||
}.show(); | |||||||||
8.异常,严重的java通过Error类进行描述,不严重的,通过Exception类进行描述 | |||||||||
9.声明几个异常,就对应有几个catch块,如果多个catch块中的异常出现继承关系, | |||||||||
父类异常catch块放在最下面 | |||||||||
10.RuntimeException和它的子类是Exception中的一个特殊的异常,如果在函数内抛出该异常, | |||||||||
函数上可以不用声明,调用者也不用进行处理,编译一样通过。 | |||||||||
11.throws后面跟的是异常类,可以有多个;throw后面跟的是异常对象, | |||||||||
catch语句内的throw抛出后,函数就结束了,相当于return | |||||||||
12.如果父类的函数抛出一个异常A,那么子类中覆盖父类该函数的函数只能抛出异常A或A的子类;如果子类方法会产生其他异常,则只能在内部处理,不能抛出。如果父类方法
| |||||||||
练习4
package com.itheima.day03;
import java.util.concurrent.locks.*;
/**
*练习4:请写出一个死锁程序
*该类用于描述一个死锁,这里用生产和销售线程作演示
*/
public class Deadlock implements Runnable
{
private boolean flag;//进程选择标志,值为true执行生产方法,值为false执行消费方法
private static int task=0;
private static int products=10;
private static Lock lockA=new ReentrantLock();
private static Lock lockB=new ReentrantLock();
public Deadlock(boolean flag)
{
this.flag=flag;
}
/**
*生产方法,生产一个消费一个.
*/
public void produce()
{
lockA.lock();//A锁
if(this.task==10)
return;
this.task++;
this.products++;
System.out.println(Thread.currentThread().getName()+":Waiting for consuming.");
this.consume();//B锁
lockA.unlock();
}
/**
*消费方法,消费一个,生产一个.
*/
public void consume()
{
lockB.lock();//B锁
products--;
System.out.println(Thread.currentThread().getName()+":Waiting for producing.");
this.produce();//A锁
lockB.unlock();
}
public void run()
{
if(this.flag)
this.produce();
else
this.consume();
}
}
package com.itheima;
import com.itheima.day03.*;
/**
*该类用于演示死锁
*@author R
*/
public class DeadlockDemo
{
public static void main(String[] args)
{
Thread t1=new Thread(new Deadlock(true));
Thread t2=new Thread(new Deadlock(false));
t1.start();
t2.start();
}
}