发表于: 2018-02-08 22:32:29

1 736


今日完成

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()方法的运用;



返回列表 返回列表
评论

    分享到