java编程思想读书笔记(四)
1、java的多线程和其他的语言有明显的不同,多线程的类是采用一个继承的方法。
1 import java.io.File; 2 import java.lang.reflect.Constructor; 3 import java.util.*; 4 5 class MyThread extends Thread{ 6 public void run(){ 7 System.out.println("This is Hellow world from thread"); 8 } 9 } 10 public class HellowWorld { 11 12 public static void main(String[] args){ 13 MyThread mt = new MyThread(); 14 mt.start(); 15 } 16 }
输出会显示“This is Hellow world from thread”。
如果想把一个函数或者代码段进行枷锁就要用到synchronized,
上面的函数可以写成
1 class MyThread extends Thread{ 2 public synchronized void run(){ 3 System.out.println("This is Hellow world from thread"); 4 } 5 }
或者
1 class MyThread extends Thread{ 2 public void run(){ 3 synchronized (this){ 4 System.out.println("This is Hellow world from thread"); 5 } 6 } 7 }
线程发生阻塞会有一下场景:
(1) 调用sleep(毫秒数),使线程进入“睡眠”状态。在规定的时间内,这个线程是不会运行的。
(2) 用suspend()暂停了线程的执行。除非线程收到resume()消息,否则不会返回“可运行”状态。
(3) 用wait()暂停了线程的执行。除非线程收到nofify()或者notifyAll()消息,否则不会变成“可运行”
(是的,这看起来同原因2非常相象,但有一个明显的区别是我们马上要揭示的)。
(4) 线程正在等候一些IO(输入输出)操作完成。
(5) 线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。
其中wait也可以加一个时间,等时间过了以后如果还没有收到notify消息,则继续运行。
2、java的socket通信
java的socket通信的服务器类不需要知道具体的IP地址,仅仅需要设置一个端口号就可以了。
ServerSocket s = new ServerSocket(PORT); //建立一个socket类 Socket socket = s.accept(); //获取一个socket连接 BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));//获取socket的数据流 PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true);//写入数据流 String str = in.readLine(); //读数据 out.println(str); //发数据
不过当然了,客户端肯定是需要Ip地址了
1 InetAddress addr = 2 InetAddress.getByName(null); 3 4 Socket socket = 5 new Socket(addr,8080);
读取数据和服务器端是一样的,这里就不赘述了。
3、连接数据库
JDBC Java数据库连接的缩写
连接一个数据库需要三方面的内容
(1) 用“jdbc”指出要使用JDBC。
(2) “子协议”:驱动程序的名字或者一种数据库连接机制的名称。由于JDBC的设计从ODBC吸收了许多灵
感,所以可以选用的第一种子协议就是“jdbc-odbc桥”,它用“odbc”关键字即可指定。
(3) 数据库标识符:随使用的数据库驱动程序的不同而变化,但一般都提供了一个比较符合逻辑的名称,由
数据库管理软件映射(对应)到保存了数据表的一个物理目录。为使自己的数据库标识符具有任何含义,必
须用自己的数据库管理软件为自己喜欢的名字注册(注册的具体过程又随运行平台的不同而变化)。
所有这些信息都统一编译到一个字串里,即“数据库URL”。举个例子来说,若想通过ODBC子协议同一个标
识为“people”的数据库连接,相应的数据库URL可设为:
String dbUrl = "jdbc:odbc:people"
如果通过一个网络连接,数据库URL也需要包含对远程机器进行标识的信息。
准备好同数据库连接后,可调用静态方法DriverManager.getConnection(),将数据库的URL以及进入那个
数据库所需的用户名密码传递给它。得到的返回结果是一个Connection对象,利用它即可查询和操纵数据
库。
1 class Lookup { 2 public static void main(String[] args) { 3 String dbUrl = "jdbc:odbc:people"; 4 String user = ""; 5 String password = ""; 6 try { 7 // Load the driver (registers itself) 8 Class.forName( 9 "sun.jdbc.odbc.JdbcOdbcDriver"); 10 Connection c = DriverManager.getConnection( 11 dbUrl, user, password); 12 Statement s = c.createStatement(); 13 // SQL code: 14 ResultSet r = 15 s.executeQuery( 16 "SELECT FIRST, LAST, EMAIL " + 17 "FROM people.csv people " + 18 "WHERE " + 19 "(LAST='" + args[0] + "') " + 20 " AND (EMAIL Is Not Null) " + 21 "ORDER BY FIRST"); 22 while(r.next()) { 23 // Capitalization doesn't matter: 24 System.out.println( 25 r.getString("Last") + ", " 26 + r.getString("fIRST") 27 + ": " + r.getString("EMAIL") ); 28 } 29 s.close(); // Also closes ResultSet 30 } catch(Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 } ///:~
这个操作的流程基本上和C#差不多,不过好像比C#要简单一些。