一、线程
根据API 1.6
创建线程有两种方式:
1. extends Thread
Thread类 :public class Thread extends Object implements Runnable
- 继承Thread类
- 重写Thread类的run方法
- 调用Thread子类的start'()方法,启动Thread子类。
2. implements Runnable
- 实现Runnable接口
- 重写Runnable接口的run()方法
- 创建该Runnable子类的对象
- 将该对象的引用作为参数传递给Thread类的构造函数 new Thread(new Runnable())
- 调用Thread的start()方法,启动线程
出现死锁现象,我的演示代码原理是:在同步代码块中,嵌套代码块:
synchronized(lock1) {
...
synchronized(lock2) {
...
}
}
package com.lxh.interview;
import java.io.IOException;
public class DeadLock {
/**
* 模拟产生一个死锁
*
* 思路:
* 1. 创建两个锁对象
* 2. 生成两个线程,操作同一个资源
* 3. 资源文件继承Runnable接口,资源中,设有boolean flag标记,第一个线程启动后执行共同资源的if{}代码块
* 改变flag,启动另一个线程,让该线程执行共同资源的else{}代码块。
* 在if和else代码块中,锁中嵌套锁,并且不停的循环操作。
*/
public static void main(String[] args) {
Source s = new Source();
Thread t1 = new Thread(s);
t1.start();
try{
// 时间的设置,不可以过短,否则前一个线程就没有机会启动了。
Thread.sleep(1);
} catch(InterruptedException e) {
e.printStackTrace();
}
s.flag = false;
Thread t2 = new Thread(s);
t2.start();
}
}
class Lock {
static Object lock1 = new Object();
static Object lock2 = new Object();
}
class Source implements Runnable {
boolean flag = true;
public void run() {
if(flag == true) {
while(true) {
synchronized(Lock.lock1) {
System.out.println("if 中,使用了lock1");
synchronized(Lock.lock2) {
System.out.println("if 中,使用了lock2");
}
}
}
}
else {
while(true) {
synchronized(Lock.lock2) {
System.out.println("-----else 中,使用了lock2");
synchronized(Lock.lock1) {
System.out.println("-------else 中,使用了lock1");
}
}
}
}
}
}
二、File的应用-路径-文件在两个操作中,复制目录中的全部文件,拷贝文件等,常常会用到文件所在的路径。
将文件放到哪一个路径,需要将路径单独拿出来。
而IO流,要对应到具体路径下的某个文件。
根据以上两个应用,我目前将File类的使用列为两点。
1. 对于要复制到的文件夹
File dir = new File('路径");
随即要判断该文件是否存在,不存在则创建该目录。
if(!dir.exists())
dir.mkdirs();
2. 将文件复制到某路径下的具体文件名称时。
File newFile = new File(dir, file.getName());
三、UDP, TCP
TCP是对客户端套接字Socket中字节输入输出流的操作,在客户端及服务器端可以写入和读取。
在不断的传输数据时,在这里需要将监听了端口和地址的套接字对象,定义在while循环的外面,因为客户端与服务端建立连接,是通过这个端口,一个对象对应一个端口。
UDP是将数据报包DatagramPacket,在客户端和服务端传递的过程,数据封装在数据报包中。
在不断的传输数据时,需要将监听了端口和地址的套接字对象,定义在while循环的外面,因为客户端与服务端建立连接,是通过这这个端口,一个对象对应一个端口。
四、反射 Constructor
根据构造函数的参数列表,可以返回Constructor对象。
Constructor cons = Class.forName('类的完整名称").getConstructor(Parameters.class... );
通过newInstance()方法得到实例,并将兑现强制转换。
Object obj = (Object)cons.newInstance(参数);