diff --git a/corejava/corejava.iml b/corejava/corejava.iml index c035f0b..befcf3b 100644 --- a/corejava/corejava.iml +++ b/corejava/corejava.iml @@ -11,5 +11,8 @@ + + + \ No newline at end of file diff --git a/corejava/pom.xml b/corejava/pom.xml index 142eb9e..817d8d9 100644 --- a/corejava/pom.xml +++ b/corejava/pom.xml @@ -11,5 +11,25 @@ corejava + + + + org.projectlombok + lombok + true + + + com.alibaba + fastjson + 1.2.55 + + + + com.google.code.gson + gson + + + + \ No newline at end of file diff --git a/corejava/src/main/java/com/zz/classdemo/ClassDTO.java b/corejava/src/main/java/com/zz/classdemo/ClassDTO.java new file mode 100644 index 0000000..29e08d0 --- /dev/null +++ b/corejava/src/main/java/com/zz/classdemo/ClassDTO.java @@ -0,0 +1,16 @@ +package com.zz.classdemo; + +import lombok.Data; + +import java.util.Set; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/25$ 21:44$ + */ +@Data +public class ClassDTO { + private String name; + private String students; +} diff --git a/corejava/src/main/java/com/zz/classdemo/ClassMaster.java b/corejava/src/main/java/com/zz/classdemo/ClassMaster.java new file mode 100644 index 0000000..e4a67e1 --- /dev/null +++ b/corejava/src/main/java/com/zz/classdemo/ClassMaster.java @@ -0,0 +1,18 @@ +package com.zz.classdemo; + +import lombok.Data; + +import java.util.Set; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/25$ 21:42$ + */ +@Data +public class ClassMaster { + private String name; + private Set students; + + +} diff --git a/corejava/src/main/java/com/zz/classdemo/Student.java b/corejava/src/main/java/com/zz/classdemo/Student.java new file mode 100644 index 0000000..c6117e8 --- /dev/null +++ b/corejava/src/main/java/com/zz/classdemo/Student.java @@ -0,0 +1,38 @@ +package com.zz.classdemo; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/25$ 21:28$ + */ +public class Student { + + private String name; + + private Integer age; + + public Student() { + + } + + public Student(String name,Integer age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/corejava/src/main/java/com/zz/classdemo/Test.java b/corejava/src/main/java/com/zz/classdemo/Test.java new file mode 100644 index 0000000..d7db709 --- /dev/null +++ b/corejava/src/main/java/com/zz/classdemo/Test.java @@ -0,0 +1,148 @@ +package com.zz.classdemo; + +import com.zz.thread.Count; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/25$ 21:21$ + */ +public class Test { + public static void main(String[] args) { +// Count count=new Count(); +// Class c=count.getClass(); +// //利用反射 获取一个类的所有属性 +// Field[] fs=c.getDeclaredFields(); +// for(Field field:fs){ +// System.out.println(field.getName()); +// } + try { + testConstructor(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + public static void testMethod() throws Exception { + Class aClass = (Class) Class.forName("com.zz.classdemo.Student"); + //1.获取方法 + // 获取取clazz对应类中的所有方法--方法数组(一) + // 不能获取private方法,并且获取从父类继承来的所有方法 + Method[] methods = aClass.getMethods(); + for (Method method:methods) { + System.out.println(method); + } + System.out.println("================================"); + //2.获取方法 + // 获取取clazz对应类中的所有方法--方法数组(一) + // 不能获取private方法,不获取从父类继承来的所有方法 + Method[] declaredMethods = aClass.getDeclaredMethods(); + for (Method method:declaredMethods) { + System.out.println(method); + } + + System.out.println("================================="); + // 1.3.获取指定的方法 + // 需要参数名称和参数列表,无参则不需要写 + // 对于方法public void setName(String name) { } + Method method = aClass.getDeclaredMethod("setName", String.class); + System.out.println(method); + // 而对于方法public void setAge(int age) { } + method = aClass.getDeclaredMethod("setAge", Integer.class); + System.out.println(method); + // 这样写是获取不到的,如果方法的参数类型是int型 + // 如果方法用于反射,那么要么int类型写成Integer: public void setAge(Integer age) { } + // 要么获取方法的参数写成int.class + + //2.执行方法 + // invoke第一个参数表示执行哪个对象的方法,剩下的参数是执行方法时需要传入的参数 + Object obje = aClass.newInstance(); + method.invoke(obje,2); + + //如果一个方法是私有方法,第三步是可以获取到的,但是这一步却不能执行 + //私有方法的执行,必须在调用invoke之前加上一句method.setAccessible(true); + } + + /** + * 把类对象和类方法名作为参数,执行方法 + * + * 把全类名和方法名作为参数,执行方法 + * 可变参数可以放数组 + * @param obj: 方法执行的那个对象. + * @param methodName: 类的一个方法的方法名. 该方法也可能是私有方法. + * @param args: 调用该方法需要传入的参数 + * @return: 调用方法后的返回值 + * + */ + public Object invoke(Object obj, String methodName, Object ... args) throws Exception{ + //1. 获取 Method 对象 + // 因为getMethod的参数为Class列表类型,所以要把参数args转化为对应的Class类型。 + + Class [] parameterTypes = new Class[args.length]; + for(int i = 0; i < args.length; i++){ + parameterTypes[i] = args[i].getClass(); + System.out.println(parameterTypes[i]); + } + + Method method = obj.getClass().getDeclaredMethod(methodName, parameterTypes); + //如果使用getDeclaredMethod,就不能获取父类方法,如果使用getMethod,就不能获取私有方法 + + // + //2. 执行 Method 方法 + //3. 返回方法的返回值 + return method.invoke(obj, args); + } + + public static void testField() throws Exception { + Class aClass = (Class) Class.forName("com.zz.classdemo.Student"); + //1.获取字段 + // 1.1 获取所有字段 -- 字段数组 + // 可以获取公用和私有的所有字段,但不能获取父类字段 + Field[] declaredFields = aClass.getDeclaredFields(); + for (Field field:declaredFields) { + System.out.println(field); + } + System.out.println("============================="); + // 1.2获取指定字段 + Field field = aClass.getDeclaredField("name"); + System.out.println(field.getName()); + + System.out.println("=============================="); + + Student student = new Student(); + //如果字段是私有的,不管是读值还是写值,都必须先调用setAccessible(true)方法 + field.setAccessible(true); + student.setAge(1); + student.setName("张三"); + //2.使用字段 + // 2.1获取指定对象的指定字段的值 + Object o = field.get(student); + System.out.println(o); + System.out.println("=========================="); + // 2.2设置指定对象的指定对象Field值 + field.set(student, "DEF"); + System.out.println(student.getName()); + } + public static void testConstructor() throws Exception{ + Class aClass = (Class) Class.forName("com.zz.classdemo.Student"); + //1. 获取 Constructor 对象 + // 1.1 获取全部 + Constructor[] constructors = aClass.getConstructors(); + for (Constructor constructor:constructors) { + System.out.println(constructor); + } + System.out.println("============================"); + // 1.2获取某一个,需要参数列表 + Constructor constructor = aClass.getConstructor(String.class, Integer.class); + System.out.println(constructor); + System.out.println("============================"); + //2. 调用构造器的 newInstance() 方法创建对象 + Object obj = constructor.newInstance("zhagn", 1); + } +} diff --git a/corejava/src/main/java/com/zz/classdemo/Test2.java b/corejava/src/main/java/com/zz/classdemo/Test2.java new file mode 100644 index 0000000..660189c --- /dev/null +++ b/corejava/src/main/java/com/zz/classdemo/Test2.java @@ -0,0 +1,17 @@ +package com.zz.classdemo; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/25$ 21:45$ + */ +public class Test2 { + public static void main(String[] args) { + ClassDTO dto=new ClassDTO(); + dto.setName("java10班"); + dto.setStudents("[{name:\"张三\",age:21},{name:\"李四\",age:81}]"); + + + + } +} diff --git a/corejava/src/main/java/com/zz/proxy/HelloService.java b/corejava/src/main/java/com/zz/proxy/HelloService.java new file mode 100644 index 0000000..250efb0 --- /dev/null +++ b/corejava/src/main/java/com/zz/proxy/HelloService.java @@ -0,0 +1,22 @@ +package com.zz.proxy; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/23$ 21:11$ + */ +// 委托类 +public class HelloService implements IHelloService { + + @Override + public String sayHello(String userName) { + System.out.println(userName + " hello"); + return userName + " hello"; + } + + @Override + public String sayByeBye(String userName) { + System.out.println(userName + " ByeBye"); + return userName + " ByeBye"; + } +} diff --git a/corejava/src/main/java/com/zz/proxy/IHelloService.java b/corejava/src/main/java/com/zz/proxy/IHelloService.java new file mode 100644 index 0000000..7a91229 --- /dev/null +++ b/corejava/src/main/java/com/zz/proxy/IHelloService.java @@ -0,0 +1,25 @@ +package com.zz.proxy; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/23$ 21:10$ + */ +// 委托类接口 +public interface IHelloService { + + /** + * 方法1 + * @param userName + * @return + */ + String sayHello(String userName); + + /** + * 方法2 + * @param userName + * @return + */ + String sayByeBye(String userName); + +} diff --git a/corejava/src/main/java/com/zz/proxy/JavaProxyInvocationHandler.java b/corejava/src/main/java/com/zz/proxy/JavaProxyInvocationHandler.java new file mode 100644 index 0000000..b1ed406 --- /dev/null +++ b/corejava/src/main/java/com/zz/proxy/JavaProxyInvocationHandler.java @@ -0,0 +1,64 @@ +package com.zz.proxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/23$ 21:11$ + */ +// 中间类 +public class JavaProxyInvocationHandler implements InvocationHandler { + + /** + * 中间类持有委托类对象的引用,这里会构成一种静态代理关系 + */ + private Object obj ; + + /** + * 有参构造器,传入委托类的对象 + * @param obj 委托类的对象 + */ + public JavaProxyInvocationHandler(Object obj){ + this.obj = obj; + + } + + /** + * 动态生成代理类对象,Proxy.newProxyInstance + * @return 返回代理类的实例 + */ + public Object newProxyInstance() { + return Proxy.newProxyInstance( + //指定代理对象的类加载器 + obj.getClass().getClassLoader(), + //代理对象需要实现的接口,可以同时指定多个接口 + obj.getClass().getInterfaces(), + //方法调用的实际处理者,代理对象的方法调用都会转发到这里 + this); + } + + + /** + * + * @param proxy 代理对象 + * @param method 代理方法 + * @param args 方法的参数 + * @return + * @throws Throwable + */ + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + System.out.println("invoke before"); + Object result = method.invoke(obj, args); + System.out.println("invoke after"); + return result; + } + +// @Override +// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { +// return null; +// } +} diff --git a/corejava/src/main/java/com/zz/proxy/MainJavaProxy.java b/corejava/src/main/java/com/zz/proxy/MainJavaProxy.java new file mode 100644 index 0000000..419daff --- /dev/null +++ b/corejava/src/main/java/com/zz/proxy/MainJavaProxy.java @@ -0,0 +1,18 @@ +package com.zz.proxy; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/23$ 21:12$ + */ +// 测试动态代理类 +public class MainJavaProxy { + public static void main(String[] args) { + JavaProxyInvocationHandler proxyInvocationHandler = new JavaProxyInvocationHandler(new HelloService()); + IHelloService helloService = (IHelloService) proxyInvocationHandler.newProxyInstance(); + helloService.sayByeBye("allen"); + helloService.sayHello("jerry"); + } + +} + diff --git a/corejava/src/main/java/com/zz/thread/A.java b/corejava/src/main/java/com/zz/thread/A.java new file mode 100644 index 0000000..0585062 --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/A.java @@ -0,0 +1,18 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 19:14$ + */ +public class A implements Runnable { + Count count; + public A(Count count99){ + this.count=count99; + } + @Override + public void run() { + count.t1(); + + } +} diff --git a/corejava/src/main/java/com/zz/thread/B.java b/corejava/src/main/java/com/zz/thread/B.java new file mode 100644 index 0000000..3786487 --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/B.java @@ -0,0 +1,25 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 19:14$ + */ +public class B implements Runnable { + + Count count; + public B(Count count55){ + this.count=count55; + } + + + @Override + public void run() { + try { + Thread.sleep(5000); + this.count.t2(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/corejava/src/main/java/com/zz/thread/Count.java b/corejava/src/main/java/com/zz/thread/Count.java new file mode 100644 index 0000000..cc4e3d4 --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Count.java @@ -0,0 +1,49 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 16:52$ + */ +public class Count { + public int balance=1000; + public String name; + + public int getBalance(){ + return this.balance; + } + public void reduce(int num) { + synchronized(this) { + if(num<=this.balance){ + + System.out.println("成功取出:" + num); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + this.balance = this.balance - num; + } + } + + } + + + public synchronized void t1(){ + System.out.println("进入t1方法"); + try { + wait(); + System.out.println("t1方法被叫醒"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + + + public synchronized void t2(){ + notifyAll(); + + } +} diff --git a/corejava/src/main/java/com/zz/thread/Demo1.java b/corejava/src/main/java/com/zz/thread/Demo1.java new file mode 100644 index 0000000..2966f37 --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Demo1.java @@ -0,0 +1,17 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:16$ + */ +public class Demo1 implements Runnable{ + @Override + public void run() { +// System.out.println("run方法里面就是一个线程需要执行的任务"); + for(int i=0;i<2000;i++){ + System.out.println("**********demo1运行**********"); + } + + } +} diff --git a/corejava/src/main/java/com/zz/thread/Demo2.java b/corejava/src/main/java/com/zz/thread/Demo2.java new file mode 100644 index 0000000..81a0b9c --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Demo2.java @@ -0,0 +1,17 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:16$ + */ +public class Demo2 implements Runnable{ + @Override + public void run() { +// System.out.println("run方法里面就是一个线程需要执行的任务"); + for(int i=0;i<2000;i++){ + System.out.println("@@@@@@@@@@@@demo2运行**********"); + } + + } +} diff --git a/corejava/src/main/java/com/zz/thread/Demo3.java b/corejava/src/main/java/com/zz/thread/Demo3.java new file mode 100644 index 0000000..2474187 --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Demo3.java @@ -0,0 +1,22 @@ +package com.zz.thread; + +import java.util.Date; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:40$ + */ +public class Demo3 implements Runnable{ + @Override + public void run() { + try { + System.out.println("开始"+new Date()); + //让当前线程睡3秒后执行 + Thread.sleep(3000); + System.out.println("结束"+new Date()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/corejava/src/main/java/com/zz/thread/Demo4.java b/corejava/src/main/java/com/zz/thread/Demo4.java new file mode 100644 index 0000000..1a127df --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Demo4.java @@ -0,0 +1,21 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:16$ + */ +public class Demo4 implements Runnable{ + Task task; + public Demo4(Task task){ + this.task=task; + } + @Override + public void run() { +// System.out.println("run方法里面就是一个线程需要执行的任务"); + for(int i=0;i<300;i++){ + this.task.finishtask(); + } + + } +} diff --git a/corejava/src/main/java/com/zz/thread/Demo5.java b/corejava/src/main/java/com/zz/thread/Demo5.java new file mode 100644 index 0000000..bf4c57f --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Demo5.java @@ -0,0 +1,21 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:16$ + */ +public class Demo5 implements Runnable{ + Task task; + public Demo5(Task task){ + this.task=task; + } + @Override + public void run() { +// System.out.println("run方法里面就是一个线程需要执行的任务"); + for(int i=0;i<300;i++){ + this.task.finishtask(); + } + + } +} diff --git a/corejava/src/main/java/com/zz/thread/Demo6.java b/corejava/src/main/java/com/zz/thread/Demo6.java new file mode 100644 index 0000000..4fd73fe --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Demo6.java @@ -0,0 +1,14 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 16:04$ + */ +public class Demo6 extends Thread { + + public void run(){ + System.out.println("线程demo6 运行"); + } + +} diff --git a/corejava/src/main/java/com/zz/thread/T1.java b/corejava/src/main/java/com/zz/thread/T1.java new file mode 100644 index 0000000..c076f0f --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/T1.java @@ -0,0 +1,19 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 16:55$ + */ +public class T1 extends Thread { + Count count; + T1(Count c){ + this.count=c; + } + + public void run(){ + count.reduce(1000); + + System.out.println(count.getBalance()); + } +} diff --git a/corejava/src/main/java/com/zz/thread/Task.java b/corejava/src/main/java/com/zz/thread/Task.java new file mode 100644 index 0000000..6ac90de --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Task.java @@ -0,0 +1,19 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:50$ + */ +public class Task { + int total=600; + int runtime=0; + + public void finishtask(){ + //相当于this.total=this.total-1 + this.total--; + this.runtime++; + System.out.println("total="+total+"****runtime="+runtime); + } + +} diff --git a/corejava/src/main/java/com/zz/thread/Test.java b/corejava/src/main/java/com/zz/thread/Test.java new file mode 100644 index 0000000..a17b486 --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Test.java @@ -0,0 +1,33 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/20$ 21:21$ + */ +public class Test { + + public static void main(String[] args) { +// Demo1 demo1=new Demo1(); +// Thread t1=new Thread(demo1); +// //启动一个线程是执行start方法 +// t1.start(); +// +// Demo2 demo2=new Demo2(); +// Thread t2=new Thread(demo2); +// t2.start(); + + Task task=new Task(); + + Demo4 demo4=new Demo4(task); + Thread t2=new Thread(demo4); + t2.start(); + + Demo5 demo5=new Demo5(task); + Thread t3=new Thread(demo5); + t3.start(); + + System.out.println("执行次数"+task.runtime); + System.out.println("任务总数"+task.total); + } +} diff --git a/corejava/src/main/java/com/zz/thread/Test2.java b/corejava/src/main/java/com/zz/thread/Test2.java new file mode 100644 index 0000000..280756f --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Test2.java @@ -0,0 +1,14 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 16:07$ + */ +public class Test2 { + + public static void main(String[] args) { + Demo6 demo6=new Demo6(); + demo6.start(); + } +} diff --git a/corejava/src/main/java/com/zz/thread/Test3.java b/corejava/src/main/java/com/zz/thread/Test3.java new file mode 100644 index 0000000..1a881ef --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Test3.java @@ -0,0 +1,18 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 16:58$ + */ +public class Test3 { + public static void main(String[] args) { + Count count=new Count(); + + T1 t1=new T1(count); + T1 t2=new T1(count); + + t1.start(); + t2.start(); + } +} diff --git a/corejava/src/main/java/com/zz/thread/Test4.java b/corejava/src/main/java/com/zz/thread/Test4.java new file mode 100644 index 0000000..4a9b0ac --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Test4.java @@ -0,0 +1,21 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 19:21$ + */ +public class Test4 { + + public static void main(String[] args) { + Count count2=new Count(); + + A a1=new A(count2); + B b=new B(count2); + + Thread t1=new Thread(a1); + Thread t2=new Thread(b); + t1.start(); + t2.start(); + } +} diff --git a/corejava/src/main/java/com/zz/thread/Test5.java b/corejava/src/main/java/com/zz/thread/Test5.java new file mode 100644 index 0000000..62f401f --- /dev/null +++ b/corejava/src/main/java/com/zz/thread/Test5.java @@ -0,0 +1,49 @@ +package com.zz.thread; + +/** + * @Description: java类作用描述 + * @Author: Bsea + * @CreateDate: 2019/9/21$ 20:35$ + */ +public class Test5 { + + public static void main(String[] args) { + Test5 test5=new Test5(); + Thread t1=new Thread( + new Runnable(){ + + @Override + public void run() { + test5.t1(); + } + } + ); + + Thread t2=new Thread( + new Runnable(){ + + @Override + public void run() { + test5.t2(); + } + } + ); + + t1.start(); + t2.start(); + }; + public synchronized void t1(){ + try { + System.out.println("开始等待"); + wait(); + System.out.println("被叫醒"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public synchronized void t2(){ + System.out.println("开始叫醒"); + notify(); + } +}