Category - java_basis

  1. /**
  2. * 线程通信的例子:使用两个线程打印1-100。线程1,线程2,交替打印
  3. *
  4. * 涉及到的三个方法:
  5. * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
  6. * notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。
  7. * notifyAll():旦执行此方法,就会唤醒所有被wait的线程。
  8. *
  9. * 说明:
  10. * 1.wait() notify() notifyAll() 这三个方法必须使用在同步代码块或同步方法中。
  11. * 2.wait() notify() notifyAll() 这三个方法必须是同步代码块或同步方法中的同步监视器
  12. * 否则,会出现IllegalMonitorStateException异常
  13. * 3.wait() notify() notifyAll() 这三个方法是定义在java.Lang.Object类中。
  14. *
  15. * 面试题:sleep() 和 wait()的异同?
  16. * 1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
  17. * 2.不同点:1)两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
  18. * 2)调用的要求不同:sleep()可以再任何需要的场景下调用。wait()必须使用在同步代码块或同步方法中。
  19. * 3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。
  20. *
  21. *
  22. * @author JiaMing_Xu
  23. * @create 2024-09-10-15:54
  24. */
  25. class Number implements Runnable{
  26. private int number = 1;
  27. @Override
  28. public void run() {
  29. while (true){
  30. synchronized (this) {
  31. this.notifyAll();
  32. if (number
  1. package com.atguigu.java;
  2. /**
  3. * 创建多线程的方式二:实现Runnable类
  4. * 1. 创建一个实现了Runnable接口的类
  5. * 2. 实现类去实现Runnable中的抽象方法:run()
  6. * 3. 创建实现类的对象
  7. * 4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
  8. * 5. 通过Thread类的对象调用start()
  9. *
  10. * @author JiaMing_Xu
  11. * @create 2024-03-05-21:00
  12. */
  13. class MThread implements Runnable{
  14. //2. 实现类去实现Runnable中的抽象方法:run()
  15. @Override
  16. public void run() {
  17. for(int i = 0;i < 100;i++){
  18. if (i % 2 ==0){
  19. System.out.println(Thread.currentThread().getName()+":"+i);
  20. }
  21. }
  22. }
  23. }
  24. public class ThreadTest1 {
  25. public static void main(String[] args) {
  26. //3. 创建实现类的对象
  27. MThread mThread = new MThread();
  28. //4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
  29. Thread t1 = new Thread(mThread);
  30. t1.setName("线程一");
  31. //5. 通过Thread类的对象调用start():1️⃣启动线程 2️⃣调用当前线程的run() -->调用了Runnable类型的run()
  32. t1.start();
  33. //再启动一个线程,遍历100以内的偶数
  34. Thread t2 = new Thread(mThread);
  35. t2.setName("线程二");
  1. /**
  2. * 多线程的创建,方式一:继承于Thread类
  3. * 1. 创建一个继承于Thread类的子类
  4. * 2. 重写Thread类的run() --> 将此线程执行的操作声明在run()中
  5. * 3. 创建Thread类的子类的对象
  6. * 4. 通过此对象调用start()
  7. *
  8. * 例子:遍历100以内的所有的偶数
  9. *
  10. * @author JiaMing_Xu
  11. * @create 2024-01-19-19:48
  12. */
  13. //1. 创建一个继承于Thread类的子类
  14. class MyThread extends Thread{
  15. //2. 重写Thread类的run()
  16. @Override
  17. public void run() {
  18. for (int i = 0;i < 100;i++){
  19. if (i % 2 == 0){
  20. System.out.println(Thread.currentThread().getName() + ":" + i);
  21. }
  22. }
  23. }
  24. }
  25. public class ThreadTest {
  26. public static void main(String[] args) {
  27. //3. 创建Thread类的子类的对象
  28. MyThread myThread = new MyThread();
  29. //4. 通过此对象调用start():①启动当前线程 ②调用当前线程的run()
  30. myThread.start();
  31. //问题一:我们不能直接调用run()的方式启动线程。
  32. //问题二:再启动一个线程,遍历100以内的偶数
  33. // myThread.start();
  34. //我们需要重新创建一个线程的对象
  35. MyThread t2 = new MyThread();
  36. t2.start();
  37. for (int i = 0;i < 100;i++){
  38. if (i % 2
  1. /**
  2. * 测试Thread中的常用方法:
  3. * 1. start():启动当前线程:调用当前线程的run()
  4. * 2. run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
  5. * 3. currentThread():静态方法,返回执行当前代码的线程
  6. * 4. getName():获取当前线程的名字
  7. * 5. setName():设置当前线程的名字
  8. * 6. yield():释放当前cpu的执行权
  9. * 7. join():在线程a中调用线程b的join()方法,此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
  10. * 8. stop():已过时/当执行此方法时,强制结束当前线程。
  11. * 9. sleep(long millitime):让当前线程“睡眠”指定的millitime毫秒。在指定的millitime毫秒时间内,当前线程时阻塞状态。
  12. * 10. isAlive():判断当前线程是否存活
  13. *
  14. * 线程的优先级:
  15. * 1.
  16. * MAX_PRIORITY:10
  17. * MIN_PRIORITY:1
  18. * NORM_PRIORITY:5
  19. * 2. 如何获取和设置当前线程的优先级:
  20. * getPriority():获取线程的优先级
  21. * setPriority(int p):设置线程的优先级
  22. *
  23. * 说明:高优先级的的线程要抢占低优先级线程的执行权。但是只是从概率上讲,高优先级的线程高概率的情况下被执行。并不意味着只有当高优先级的线程执行完以后,低优先级的线程才执行
  24. *
  25. * @author JiaMing_Xu
  26. * @create 2024-01-22-19:46
  27. */
  28. class HelloThread extends Thread{
  29. @Override
  30. public void run() {
  31. for (int i = 0;i < 100;i++){
  32. if (i % 2 == 0){
  33. // try {
  34. // sleep(10);
  35. // } catc
 
 
 
  1. /*
  2. * try-catch-finally中finally的使用
  3. *
  4. * 1.finally是可选的
  5. * 2.finally中声明的一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有
  6. * return语句的情况。
  7. *
  8. * 3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的
  9. * 释放。此时的资源释放,就需要声明在finally中。
  10. *
  11. */

 
 
 
  1. /*
  2. * 异常处理的方式二:throws + 异常类型
  3. *
  4. * 1."throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。
  5. * 一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常异常类的对象,此对象满足throws后异常
  6. * 类型时,就会被抛出。异常代码后续的代码,就不再执行!
  7. *
  8. * 2.体会:try-catch-finally:真正的将异常给处理掉了。
  9. * throws的方式只是将异常抛给了方法的调用者。并没有真正将异常处理掉。
  10. *
  11. * 3.开发中如何选择使用try-catch-finally还是使用throws?
  12. * 3.1如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也甭能使用throws,意味着如果
  13. * 子类重写的方法中有异常,必须使用try-catch-finally方式处理。
  14. * 3.2执行的方法中,先后调用了另外的几个方法,这几个方法时递进关系执行的。我们建议这几个方法使用throws
  15. * 的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方法进行处理。
  16. *
  17. */

 
 
 
  1. /*
  2. * 一、异常的处理:抓抛模型
  3. *
  4. * 过程一:抛:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。
  5. * 并将此对象抛出。
  6. * 一旦抛出对象后,其后的代码就不再执行。
  7. *
  8. *
  9. * 过程二:抓:可以理解为异常的处理方式:① try-catch-finally ② throws
  10. *
  11. *
  12. * 二、try-catch-finally的使用
  13. * 说明:
  14. * 1.finally是可选的。
  15. * 2.使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象
  16. * 的类型,去catch中进行匹配。
  17. * 3.一旦try中的异常对象匹配到某一个catch时,就进入catch中进行有异常的处理。一旦处理完成,就跳出当前的
  18. * try-catch结构(在没有写finally的情况下)
  19. * 4.catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
  20. * catch中的异常类型如果满足子父类关系,则要求子类一定要声明在父类的上面。否则,报错
  21. * 5.常用的异常对象处理的方式:① String getMessage() ② printStackTrace
  22. * 6.在try结构中声明的变量,在出了try结构以
 

  1. * 一、异常体系结构
  2. *
  3. * java.lang.Throwable
  4. * |------java.lang.Errow:一般不编写针对性的代码进行处理。
  5. * |------java.lang.Exception:可以进行异常的处理
  6. * |------编译时异常(checked)
  7. * |------IOException
  8. * |------FileNotFoundException
  9. * |------ClassNotFoundException
  10. * |------运行时异常(unchecked,RuntimeException)
  11. * |------NullPointerException
  12. * |------ArrayIndexOutOfBoundsException
  13. * |------ClassCastException
  14. * |------NumberFormatException
  15. * |------InputMissmatchException
  16. * |------ArithmaticException
  17. *
  18. *
  19. * 面试题:常见的异常都有哪些?举例说明
 
 
 
  1. /*
  2. * 接口的使用
  3. * 1.接口使用interface来定义
  4. * 2.Java中,接口和类是并列的两个结构
  5. * 3.如何定义接口:定义接口中的成员
  6. *
  7. * 3.1 JDK7及以前:只能定义全局常量和抽象方法
  8. * >全局常量:public static final的.但是书写时,可以省略不写
  9. * >抽象方法:public abstract的
  10. * 3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
  11. *
  12. * 4.接口中不能定义构造器的!意味着接口不可以实例化
  13. *
  14. * 5.Java开发中,接口都通过让类去实现(implements)的方式来使用
  15. * 如果实现类覆盖了接口中的所有抽象方法,则此实现类可以实例化
  16. * 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
  17. *
  18. * 6.Java类可以实现多个接口 --->弥补了Java单继承的局限性
  19. * 格式:class AA extends BB implements CC,DD,EE
  20. *
  21. * 7.接口与接口之间可以继承,而且可以多继承
  22. *
  23. * 8.接口的具体实现,体现多态性
  24. *
  25. * 9.接口,实际上可以看作是一种规范
  26. *
  27. * 面试题:抽象类与接口有哪些异同?
 
 
 
  1. /*
  2. * 接口的使用
  3. * 1.接口使用上也满足多态性
  4. * 2.接口,实际上就是定义了一种规范
  5. * 3.开发中,体会面向接口编程!
  6. *
  7. */
    Page 1 of 3