回顾-线程的创建-死锁-File的应用-UDP-TCP-反射Constructor

一、线程

根据API 1.6

创建线程有两种方式:

1. extends Thread

Thread类 :public class Thread extends Object implements Runnable 

  1. 继承Thread类
  2. 重写Thread类的run方法
  3. 调用Thread子类的start'()方法,启动Thread子类。

2. implements Runnable

  1. 实现Runnable接口
  2. 重写Runnable接口的run()方法
  3. 创建该Runnable子类的对象
  4. 将该对象的引用作为参数传递给Thread类的构造函数 new Thread(new Runnable())
  5. 调用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(参数);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值