Java基础知识学习笔记总结 下

简介: 文件IO流1、 字节流FileInputStream 输入流 读文件BufferedInputStream输入流读文件 FileOutputStream输出流写入文件BufferedOutputStream输出流写入文件

文件IO流


1、 字节流


FileInputStream 输入流 读文件


BufferedInputStream输入流读文件



FileOutputStream输出流写入文件


BufferedOutputStream输出流写入文件


字符流


FileReader输入流读文件


DataInputStream输入流 读文件



FileWriter输出流 写入文件


DataOutputStream输出流 写入文件



2、FileInputStream 读取英文文件


   FileInputStreamfis = new FileInputStream("D:\\UI\\bbb.txt");


   intch = 0;


   while((ch= fis.read()) != -1){ //read从此输入流中读取一个数据字节,返回值为int


       System.out.print((char)ch);


   }


fis.close();//此程序不能读中文


3、FileInputStream 读取中文文件


   FileInputStreamfis = new FileInputStream(“D:\\UI\\bbb.txt”);


   byte[]bt = new byte[1024]; //将字节读入字节数组


   intlen = 0;


   while((len= fis.read(bt))!=-1){


       System.out.print(newString(bt,0,len));


   }


4、FileOutputStream 写入文件


   //搭建管道


FileOutputStream fos = new FileOutputStream(“D:\\UI\\bbb.txt”);


   //读写操作


   fos.write(98);//相当于b


   fos.write('a');


   String str = "ssdsdfsf";    //写入字符串


   byte[] b = str.getBytes();


   fos.write(b);


   fos.flush();//强制性的刷新缓冲区


   //关闭流


   if(fos !=null){


       fos.close();


   }


5、DataOutputStream 写入boolean、double等类型的文件


   FileOutputStream fos = null;


   DataOutputStream dos = null;


   fos =new FileOutputStream("D:\\UI\\bbb.txt");


   dos =new DataOutputStream(fos);


       


   dos.writeBoolean(true);


   dos.write('a');


   dos.writeDouble(12.34);


   for(inti=0;i<10;i++){


       doubled = Math.random();


       dos.writeDouble(d);


   }


   dos.flush();


   


   dos.close();


   fos.close();


6、DataInputStream读取boolean、double等类型的文件


   FileInputStream fis =null;


   DataInputStream dis = null;


 


   fis =new FileInputStream("D:\\UI\\bbb.txt");


   dis =new DataInputStream(fis);


   booleanbool =dis.readBoolean();


   System.out.println(bool);// true


   for(inti=0;i<10;i++){


       doubleb =dis.readDouble();


       System.out.println(b+"\t");


   }


   dis.close();


   fis.close();


   // -6.414939283240485E-86  


4.7384486223731214E285


7.602269187305488E-298


-1.4027415471626017E-278  


9.32553721042958E-38  


-1.0852988920338364E40


4.6544251087746895E49  


1.0777059597027002E40  


4.954807472569955E232  


4.957881657894938E232  


           


7、序列化和反序列化


   序列化:将对象的数据存储到文件 ObjectOutputStream


   反序列化:将文件中的数据重新读到对象 ObjectInputStream


   例题:在程序中创建一个Student类型的对象,并把对象信息保存到d:\\io\\student.txt文件中,然后再从文件中把Student对象的信息读出显示在控制台上。


   //先建立Student类


publicclassStudentimplementsSerializable {//编写一个可序列化的类  implements Serializable


   privateintid;


   private String name;


   private String birth;


   public Student(intid, Stringname, String birth) {


       super();


       this.id = id;


       this.name = name;


       this.birth = birth;


   }


   @Override


   public String toString() {


       returnid+""+name+" "+birth;


   }


}


//再进行序列化,即将Student对象写入文件,直接抛出异常范例


publicclass SObjectOutputStreamTest throws IOException{


   publicstaticvoid main(String[] args) {


           Students1 = new Student(1,"we","1987-3-4");


       Students2 = new Student(2,"you","1988-3-9");


   


       FileOutputStreamfos = null;


       ObjectOutputStreamoos = null;



       fos = new FileOutputStream("D:\\io\\student.txt");


       oos = new ObjectOutputStream(fos);


       


       oos.writeObject(s1);


       oos.writeObject(s2);



       oos.close();


       fos.close();


   }


}


//进行反序列化,将文件中的语句读出到控制台,用try catch抓住异常范例


publicclass SObjectInputStreamTest {


   publicstaticvoid main(String[]args) {


       FileInputStream fis = null;


       ObjectInputStream ois = null;


       try {


          fis =new FileInputStream("D:\\io\\student.txt");


          ois =new ObjectInputStream(fis);


       


          Student s1 = (Student)ois.readObject();


          Student s2 = (Student)ois.readObject();


       


          System.out.println(s1.toString());


          System.out.println(s2.toString());


       } catch (FileNotFoundException e) {


          e.printStackTrace();


       }catch (IOException e) {


          e.printStackTrace();


       }catch (ClassNotFoundException e) {


          e.printStackTrace();


       }finally{


          try {


              if(ois!=null){


              ois.close();


              }


           }catch (IOException e) {


              e.printStackTrace();


          }


          try {


              if(fis!=null){


              fis.close();


              }


          }catch (IOException e) {


              e.printStackTrace();


          }


       }


   }


}



多线程


1、 进程:一个应用程序的一次运行,包含多线程


多线程:一个应用程序运行过程中的某些独立的片段


2、 进程与线程的区别(优缺点)


进程:进程间切换耗费系统资源,数据安全(独立的代码和数据空间)


线程:线程间切换系统耗费比较小,数据不安全(共享代码和数据空间)


3、 编写线程(掌握)


a. 继承Thread类


publicclass ThreadTest1 {


publicstaticvoid main(String[] args) {


       ThreadDemotd = new ThreadDemo();


       td.start();


       for(inti=0;i<1000;i++){


           System.out.println("the main is:"+i);


       }


}


   }


publicclass ThreadDemoextends Thread {


   @Override


   publicvoid run() {


       for(inti=0;i<1000;i++){


           System.out.println("the run is:"+i);


       }


   }


}


b. 实现Runnable接口(推荐,因为java类和类是单继承的)


publicclass RunnableTest {


   publicstaticvoid main(String[] args) {


       RunnableDemord = new RunnableDemo();


       Threadthread = new Thread(rd);


       thread.start();


       for(inti=0;i<1000;i++){


           System.out.println("the main is:"+i);


           Thread.sleep(500);


       }


   }


}



publicclass RunnableDemoimplementsRunnable{


   @Override


   publicvoid run() {


       for(inti=0;i<1000;i++){


           System.out.println("the run is:"+i);


           Thread.sleep(500);


       }


   }


}


4、CPU调度


   抢占式


   轮时间片


5、让线程从运行状态进入到阻塞状态


Thread.yield();//暂停


Thread.sleep(500);//休眠


join();//在A线程中加入B线程,待B线程运行完后,再运行A线程


6、线程其他方法


   setName():给线程起名字,默认的名字Thread-X;x从0开始


getName():得到线程的名字


Thread.currentThread().getName():得到当前运行线程的名字


   setPriority();设置线程的优先级数值


getPriority();获得线程的优先级数值


setDaemon(true);设置为守护线程


7、用户线程和守护线程的区别


   用户线程(前台线程):必须执行完毕


   守护线程(精灵线程、后台线程):线程体执行完毕也可,执行不完毕也可以,例如垃圾回收


8、线程同步:


   加锁同步:一个对象只能有一把锁


   语句加锁 synchronized(对象){}:可以对本类对象(this)和其他类对象(new 类)加锁;某个方法中的某些句子加锁,无法得知哪些方法是被synchronized保护的


   方法加锁 synchronized void methodA(){}:只能对本类对象加锁;整个方法的所有语句加锁;可以显示得知方法是被synchronized保护的


9、死锁:两个线程,彼此在等待对方占据的锁


   锁的几种归还方式:


       a.基本上执行完同步的程序代码后,锁会自动归还


       b.用break语句跳出同步的语句块,不过这对于写在方法声明的synchronized没有作用


       c.遇到return语句


       d.遇到了异常


10、线程的生命周期


 



网络编程(java.net)


1、七层协议:


 


2、两台电脑之间的通信


   ip:ipv4(32位)、ipv6(128位)


   端口:1521(oracle)、8080(Tomcat默认的端口)、21(ftp)、80(默认的)


   协议:


UDP:传输层,用户数据的协议,无连接的协议,不可靠的,不能够准确到达,效率比较高,适用于数据量比较大并且允许出错的,比如网络视频


TCP/IP:传输层 ,有连接的协议,可靠的、准确的到达,效率比较低


http:https:ftp等在应用层


   http协议:明文无状态的


   https:密文


3、客户端和服务器端


   基于UDP的


客户端:


Socket client = new Socket("10.25.116.222",8088);


   服务器端:  


       ServerSocketserver =ServerSocket(8088);ji


       Socket s =server.accept();


4、 端口号范围是0-65535,用户普通网络程序用1024以上


5、 InetAddress此类表示互联网协议ip地址


InetAddress address = InetAddress.getByName(“主机名”);


6、getHostName()获取此IP地址的主机名


getHostAddress()获取IP地址字符串


getByName()通过主机名获取ip地址


getLocalPort()获取本程序所用接口



JAVA7新特性


1、数值型的数据赋值可以使用下划线_ 增加可读性


   不能写在小数点后;


   不能在数值型数据的开始


不能在数值型数据的最后添加


Doublepi = 3.1415_9265


Intbillion = 1_000_000_000


2、 可以声明n进制数据


Int i1= 0b0100;//4二进制前方放0b


Inti2 = 07; //7八进制前方放0


Inti3 = 0x00ad;//十六进制前方放0x


3、switch:表达式:


  jdk1.7以下byte、short、char、int;


jdk1.7以上在上面基础上加上String


4、try(IO流){


Stringstr=br.readLine();


}catch (ArithmeticException | IOException e) {//catch里可以有多个异常类,不能是父子关系


    e.printStackTrace();


}//不用关闭流了,自动资源管理器


5、泛型


   List<String>list = new List<String>();//jdk1.7以下


   List<String>list = new List< >();  //jdk1.7以上


6、新加G1垃圾回收器 提高效率


7、NIO2


   Files.copy(Paths.get(文件一),Paths.get(文件二));//直接复制文件


   File.createFile();//创建新文件


   File.move();//移动


   File.delete();


   //用WatchService类型实现文件监控


   WatchServicewatchService = FileSystems.getDefault().newWatchService();



JDBC


1、编写jdbc程序的步骤:


  1)添加数据库的驱动jar包 ojbc5.jar或者ojdbc6.jar或者classes12.jar


       工程名右击—Build Path—Add External Archives—数据库安装路径—jdbc-ojdbc6.jar


  2)创建驱动类对象  OracleDriver对象


       //创建反射机制


       Class.forName(“oracle.jdbc.driver.OracleDriver”);


  3)连接数据库  Connection


       Stringutl = “jdbc:oracle:thin:@YLMF123-3131857:1521:orcl”;


       Stringuser = “scott”;


       Stringpassword = “tiger”;


       Connectionconn = DriverManager.getConnection(url,user,password);


  4)操作数据库


       //第一种方法Statement会引起注入,不推荐使用


String sql = "select deptno,dname,loc from dept";


Statement stmt = conn.createStatement();


       ResultSet rs =stmt.executeQuery(sql);//发送sql语句到数据库,然后将查询到的结果返回到ResultSet


       //int I = stmt.executeUpdate(sql);//查询影响的行数


while(rs.next()){


          intdeptno =rs.getInt(1);//列的索引从1开始计


          String dname =rs.getString(2);


          String loc =rs.getString(3);


          System.out.println(deptno+"\t"+dname+"\t"+loc);


       }  



       //第二种方法PreparedStatement防止注入 推荐使用


       String sql = "insert into dept(deptno,dname,loc) values(?,?,?)";


       pstmt = conn.prepareStatement(sql);


       intdeptno = 35;


       String dname = "sdfs";


       String loc = "北京";


       pstmt.setInt(1, deptno);//第一个问号放deptno


       pstmt.setString(2, dname);


       pstmt.setString(3, loc);


       pstmt.executeUpdate();//执行删除、插入、修改语句,executeQuery执行查询语句


5)关闭数据库


       rs.close();


       stmt.close();


   conn.close();


2、批处理:


  stmt.addBatch(sql1);


   stmt.addBatch(sql2);//可以执行多句sql语句


  executeBatch();//执行


       String sql="insert intodept(deptno,dname,loc) values(?,?,?)";


       pstmt=conn.prepareStatement(sql);


       pstmt.setInt(1, 51);


   pstmt.setString(2, "电信部");


   pstmt.setString(3, "上海");


   pstmt.addBatch();


 


   pstmt.setInt(1, 52);


   pstmt.setString(2, "实施部");


   pstmt.setString(3, "广州");


   pstmt.addBatch();



pstmt.executeBatch();


3、事务


   conn.setAutoCommit(false):设置为手动提交事务


  conn.commit():提交


   conn.rollback():回滚,catch里面


4、元数据


   DatabaseMetaData:数据库的元数据


       DatabaseMetaDatadmd = conn.getMetaData();


       dmd.getUserName();//获得数据库名称


       dmd.getURL();//获得接口名jdbc:oracle:thin:@YLMF123-2141651:1521:orcl                            dmd.getDriverName();//当前驱动Oracle JDBC driver


   ParameterMetaData:参数的元数据


   ResultSetMetaData:结果集的元数据


       ResultSetMetaDatarmd = rs.getMetaData();


       intcount = rmd.getColumnCount();//获取结果集有多少列


       for(int i=0;i<count;i++){


       System.out.println(“列标题”+rmd.getColumnLable(i)+”数据类型”+rmd.getColumnTypeName(i));


       }


5、DAO:


1)实体类:一个对象相当于数据库表中的一行


   privateintdeptno;


   public Dept() {}


   publicint getDeptno() {


       returndeptno;


   }


   publicvoid setDeptno(intdeptno) {


       this.deptno =deptno;


   }


   @Override


   public String toString() {


       return"Dept [deptno=" +deptno +",dname=" +dname +", loc=" +loc +"]";


   }


2)操作接口:可扩展


   publicinterface DeptDao {


   void insertDept(Dept dept);


   void updateDept(Dept dept);


   void deleteDept(intdeptno);


   List<Dept>  getAllDepts();


   DeptgetDeptByDeptno(intdeptno);


}


3)操作类:


   publicclass DeptDaoImplimplementsDeptDao {


   @Override


   publicvoid insertDept(Dept dept) {


       Connection conn = null;


       PreparedStatement pstmt = null;


       try {


          conn = DbUtils.getConnection();


          String sql ="insert into dept(deptno,dname,loc)values(?,?,?)";


          pstmt =conn.prepareStatement(sql);


          pstmt.setInt(1, dept.getDeptno());


          pstmt.setString(2, dept.getDname());


          pstmt.setString(3, dept.getLoc());


       


          pstmt.executeUpdate();


       } catch (SQLException e) {


          e.printStackTrace();


       }finally{


          DbUtils.closeStatement(pstmt);


          DbUtils.closeConnection(conn);


       }


   }


   }


4)工具类:将重复的代码包装成工具类


   publicclass DbUtils {


   privatestaticfinal StringURL ="jdbc:oracle:thin:@YLMF123-2141651:1521:orcl";


   privatestaticfinal StringUSER ="scott";


   privatestaticfinal StringPASSWORD="tiger";


 


   private DbUtils(){}//构造方法


   static{


       try {


          Class.forName("oracle.jdbc.driver.OracleDriver");


       } catch (ClassNotFoundException e) {


          e.printStackTrace();


       }


   }


 


   publicstatic Connection getConnection(){


       Connection conn = null;


       try {


          conn = DriverManager.getConnection(URL,USER,PASSWORD);


       } catch (SQLException e) {


          e.printStackTrace();


       }      


       returnconn;


   }


 


   publicstaticvoid closeConnection(Connectionconn){


       try {


          if (conn !=null) {


              conn.close();


          }


       } catch (SQLException e) {


          e.printStackTrace();


       }


   }





















Html


1、属性


   align:对齐方式


   bgcolor:背景颜色


target:


_blank在新窗口打开 _self默认,在相同的框架打开


_parent在父框架集中打开 _top在整个窗口打开


framename在指定的窗口打开


2、注释


   <!--注释 -->


3、文件路径


   同一目录下:文件名


   上级目录:../


   下级目录:从目标文件开始的文件目录


4、表格


   tr行、td列、th表头


<tableborder="1" align="center" width="80%"bordercolor="green" cellspacing="0"  cellpadding="10pt"><!—cellpadding代表文字和行之间的距离-->


<caption>学生成绩表</caption>


<tr><th>姓名</th><th>年龄</th><th>成绩</th></tr>


<tr><td>张三</td><tdrowspan="2">21</td><td>34</td></tr>


<tr><td>李四</td><td>56</td></tr>


<tr><tdcolspan="3">王五</td></tr><!—colspan代表列合并,rowspan代表行合并 -->


</table>


5、表单form


表单域input


   type:text文本框、password密码、radio单选按钮、checkbox:复选框


            是否需要在本书再版时立即通知您:


             <input type="radio"checked="true">是


             <input type="radio">否


         submit提交按钮、reset重置按钮、button普通按钮


             <input type="submit" value="提交">


         hidden隐藏域(用来传送数据,不安全)


file:文件上传(两个条件:method=”post”、enctype=”multipart/form-data”)


   name:表单域的名字


   value:表单域的初始值


   size:表单元素的长度,只适用于text、password


   maxlength:表单元素中可以输入的最大字符数,只适用于text、password


   checked:boolean属性,指定按钮是否是被选中的,只适用于radio、checkbox


   readonly:只读的,只适用于text,数据能提交到后台


   disabled:表示表单域不能用,数据不能提交到后台


多行文本textarea


   <textarea cols=”20” rows=”5”></textarea>//表示可以输入5行20列


下拉列表框select


   <select name=”city” multiple>//可以选中多项


   <optionvalue=”beijing”>北京</option>


   <optionvalue=”shanghai”>上海</option>


   <optionvalue=”qingdao” selected=”true”>青岛</option>//默认选中


</select>


域容器fieldset


   <fieldset style=”width:200”>


       <legend align=”left”>小标题</legend>


       用户名:<inputtype=”text”>


       密码:<inputtype=”password”>


</fieldset>


6、框架frame


   frameset:分割窗口


rows分割行cols分割列


       frameborder:是否显示框架,0不显示、1显示,默认为1


       framespacing:框架间的间距


   frame:框架


       src:指定框架显示的HTML文件的位置


       noresize:设置不可以调整窗口的大小


       bordercolor:框架边框的颜色


<frameset rows=”10%,80%,*”>


 <framesrc=”header.html” noresize>


 <framesetcols=”20%,*”>


     <framesrc=”left.html” noresize>


     <frame src=”table.html” noresize name=”right”>


 </frameset>


 <framesrc=”footer.html” noresize>


</frameset>


<noframes>


 <body>浏览器版本较低,请升级后访问</body>


</noframes>


       marginwidth:窗口内的内容与窗口左右边缘的距离


       marginheigth:窗口内的内容与窗口上下边缘的距离


       scrolling:是否显示滚动条,no-不显示、yes-显示、auto-默认自动设置


   noframes不支持框架的浏览器


       注意:<body></body>标签与<frameset></frameset>标签不能同时使用,不过,如果添加包含一段文本的


           <noframes>标签,就必须将这一段文字嵌套于<body></body>标签内


   



 JavaScript


1、增强代码可读性


<--  JavaScript代码 //-->


2、语法结构


   1)大小写敏感


   2)一句话结束最好加;


   3)注释 //  /**/


   4)弱类型


3、变量命名


   1)以字母、下划线_或美元符号$开头


   2)余下的字符可以是字母、下划线_或美元符号$、数字


   3)最长为255个字符


   4)不能有空格、大小写敏感


   5)不能使用JavaScript中的关键字或者保留字命名


4、JS变量类型


   Undefined:未定义的类型、String、Boolean、Null、Number五种


   可以使用typeof(object)来获取变量类型


5、声明 var 变量名[=初始值]


   vari = 10;


   varj;


   alert(typeof(i));//判断i的类型 number


   docement.write(123);


6、类型转换


   字符串>数值>布尔值 低级与高级相加,强制转换成高级的


   字符串à数值


   parseInt()、parseFloat()、Number()


7、运算符


   算术运算符+、-、*、/、%、++、--(前置先自增再运算、后置先运算后自增)


   比较运算符 ==、>、>=、<、<=、!=


   逻辑运算符 &&、||、!非


   赋值运算符 =、+=、-=、*=、/=


8、try{}catch(){}


   try{vara=c}catch(e){alert(e);}


目录
相关文章
|
1月前
|
Java 编译器 开发工具
Java基础学习笔记——idea篇
JDK由JRE(包含JVM和核心类库)和开发工具箱(如javac编译器和java运行工具)组成。Java项目结构包括Project、Module、Package和Class。IDEA快捷键包括:生成main方法(main psvm)、复制代码(Ctrl+D)、删除代码(Ctrl+Y/X)、格式化代码(Ctrl+Alt+L)、重命名(Shift+F6)等。
17 0
|
1月前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
1月前
|
Java
Java中的多线程编程:基础知识与实践
【4月更文挑战第8天】本文将深入探讨Java中的多线程编程,包括其基础知识和实践应用。我们将从多线程的基本概念开始,然后深入到Java中如何创建和管理线程,以及如何使用同步机制来防止数据不一致。我们还将讨论一些常见的多线程问题,如死锁和竞态条件,并探讨如何解决这些问题。最后,我们将通过一个实际的例子来演示如何在Java中使用多线程。
|
1月前
|
Java
Java中的多线程编程:基础知识与实践
【4月更文挑战第7天】 在现代计算机科学中,多线程编程是一个不可或缺的部分。它允许多个任务在同一时间运行,从而提高了程序的效率和响应性。Java作为一种广泛使用的编程语言,其对多线程的支持使得开发人员能够编写出高效的并发程序。本文将介绍Java中多线程的基础知识,包括线程的概念、创建和管理线程的方法,以及多线程编程的实践技巧。我们将通过实例来深入理解Java多线程编程,并探讨如何有效地解决多线程带来的问题。
|
5天前
|
Java
Java中的多线程编程:基础知识与实战技巧
【5月更文挑战第6天】多线程编程是Java中的一个重要特性,它允许我们在一个程序中同时执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动、同步和通信,以及如何在Java中实现多线程编程。通过实例代码和解析,帮助读者深入理解Java多线程编程的概念和应用。
|
6天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第5天】在现代软件开发中,多线程编程是一个重要的概念,尤其是在Java这样的多平台、高性能的编程语言中。通过多线程,我们可以实现并行处理,提高程序的运行效率。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制方法,以及一些常见的多线程问题和解决方案。
|
10天前
|
并行计算 Java 数据处理
Java中的多线程编程:基础知识与实践
【5月更文挑战第1天】本文将深入探讨Java中的多线程编程,包括其基本概念、实现方式以及实际应用。我们将从理论和实践两个角度出发,详细解析线程的创建、启动、控制以及同步等关键问题,并通过实例代码演示如何在Java中有效地使用多线程。
|
10天前
|
存储 Java 程序员
Java中的多线程编程:基础知识与实践
【5月更文挑战第1天】在现代计算机科学中,多线程是一种重要的并行计算技术,允许多个执行流程并发运行。本文将深入探讨Java语言中的多线程编程,从基础概念到实际应用,帮助读者理解多线程的核心原理,并通过实例学习如何在Java中创建和管理线程。我们将涵盖线程的生命周期、同步机制以及如何利用高级类如Executor框架来优化多线程应用的性能。通过本文的学习,读者将具备设计和实现高效、稳定多线程Java应用程序的能力。
7 2
|
11天前
|
Java 调度 开发者
Java中的多线程编程:基础知识与实践
【4月更文挑战第30天】 在现代软件开发中,多线程编程是提高程序性能和响应能力的关键。Java作为一款广泛使用的编程语言,提供了丰富的多线程支持。本文将介绍Java多线程的基础概念、实现方法以及常见问题的解决策略。我们将从线程的创建和管理入手,逐步深入到同步机制、死锁避免以及高级并发工具类的应用。通过实例代码演示和理论分析,旨在帮助读者掌握Java多线程编程的核心技能,提升软件项目的并行处理能力。
|
11天前
|
存储 安全 Java
java基础知识
【4月更文挑战第30天】java基础知识
9 0