发表于: 2018-02-08 22:32:29
1 738
今日完成
1 学习多线程
1).学习匿名内部类;
a.匿名内部类也就是没有名字的内部类;
b.匿名内部类只能使用一次(因为没有名字,也就没法对其行调用和其他操作);
c.匿名内部类必须继承一个父类或实现一个接口;
示例:
new Thread(){
public void run(){
System.out.println(currentThread().getName());
}
}.start();
2).匿名内部类创建并启动线程;
3).synchronize关键字、wait()和notify()方法的学习
public class InnerclassThread{
private static int q=20;
static Object obj=new Object(); //实例化一个静态Object对象,使其能在内部类中调用
public static void main(String[] args) throws InterruptedException {
//使用匿名内部类创建对象,继承Runnale()接口
new Thread(new Runnable() {
public void run() {
synchronized (obj){ //用synchronized修饰代码块,保证在同一时刻最多只有一个线程执行该段代码
锁定object对象
System.out.println("线程0运行开始");
for (int i = 0; i<10; i++) {
q--;
System.out.println(Thread.currentThread().getName()+" 子线程0运行 "+q);
if (q==10){
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}}
System.out.println(Thread.currentThread().getName()+" thread1 complated");
}}
}).start();
Thread.sleep(500);
new Thread(new Runnable() {
public void run() {
synchronized (obj){
System.out.println("线程2运行开始");
for(int s=0;s<10;s++){
q++;
System.out.println(Thread.currentThread().getName()+" 子线程2运行"+q}
obj. notify();
System.out.println(Thread.currentThread().getName()+" thread2 complated");
}}
}).start();
}
}
wait():等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法;
notify():唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notifyAll():唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。
2.学习Loj4J(Log for Java)
Log4j有三个主要的组件:
Loggers(记录器):日志类别
Appenders (输出源):日志要输出的地方
Layouts(布局):日志以何种形式输出
a. Loggers:
Loggers组件常用的级别:DEBUG(调试消息日志)、INFO(信息)、WARN(用于警告消息)、ERROR(错误消息日志,应用程序可以继续运行)和FATAL(严重错误消息日志,必须中止运行应用程序
)。
顺序(级别)为:DEBUG < INFO < WARN < ERROR < FATAL。Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
例如:
log4j.rootLogger=DEBUG, stdout
这里Logger输出级别为DEBUG,则DEBUG、INFO、WARN、ERROR和FATAL级别的日志信息都会输出。
stdout:标准输出(standard output)。
b.Appenders
未完成学习
明天计划
1.学习log4j;
2.学习多线程(查漏补缺)
遇到问题
学习多线程的过程中,对synchronized关键字和wait()、notify()方法的使用忽略了synchronized修饰的对象,导致在上面代码的2个方法中分别锁定了不同的对象,导致输出错误(synchronized默认锁定this)。在师兄的帮助下,解决了该问题。
收获
学习到了多线程中匿名内部类、synchronized、wait()方法和notify()方法的运用;
评论