使用Socket连接到指定主机:使用Socket类的getInetAddress()方法。
public static void main(String[] args) {
try {
InetAddress address;
Socket sock = new Socket("www.baidu.com", 80);
address = sock.getInetAddress();
System.out.println("连接到 " + address);
sock.close();
} catch (java.io.IOException e) {
System.out.println("无法连接 " + args[0]);
System.out.println(e);
}
}
获取URL响应头的日期信息:使用HttpURLConnection的httpCon.getDate()方法。
public static void main(String args[]) throws Exception {
URL url = new URL("http://www.baidu.com");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
long date = httpCon.getDate();
if (date == 0)
System.out.println("无法获取信息。");
else {
System.out.println("日期:" + new Date(date));
}
}
解析URL:URL类的getProtocol(获取此URL的协议名称) ,getFile(获取此URL的文件名,没有文件名,则返回一个空字符串),getHost(获取此URL的主机名),getPath(获取此URL的路径部分,没有则返回一个字符串),getPort(获取此URL的协议名称)。getDefaultPort(获取与此URL关联协议的默认端口号)。
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.baidu.com");
System.out.println("URL是:" + url.toString());
System.out.println("协议是:" + url.getProtocol());
System.out.println("文件名是:" + url.getFile());
System.out.println("主机是:" + url.getHost());
System.out.println("路径是:" + url.getPath());
System.out.println("端口号是:" + url.getPort());
System.out.println("默认端口号是:" + url.getDefaultPort());
}
查看线程是否存活:isAlive()判断当前的线程是否处于活动状态;活动状态就是线程已经启动尚未终止,这个时候线程就是存活的,返回true,否则返回false。
class MyThread extends Thread {
@Override
public void run() {
System.out.println("运行:" + isAlive());
}
}
public class Test8 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
System.out.println("开始:" + myThread.isAlive());
myThread.start();
Thread.sleep(1000);
System.out.println("结束:" + myThread.isAlive());
}
}
获取当前线程名称:使用Thread类的getName()方法。
public static void main(String[] args) {
System.out.println("名称是:"+Thread.currentThread().getName());
}
线程优先级设置:继承Thread重写run方法;创建线程的实现类对象;setPriority(数越高获取的几率高,并不是每次数越大都能优先获取)设置线程的优先级;再启动线程。
public class Test10 extends Thread {
@Override
public void run() {
for (int i = 1; i < 5; i++) {
System.out.println(getName() + ":" + i);
}
}
public static void main(String[] args) {
Test10 test = new Test10();
Test10 test1 = new Test10();
test1.setPriority(6);
test.setPriority(10);
test.start();
test1.start();
System.out.println(Thread.currentThread().getName());
}
}
死锁的解锁方法:死锁是由两个或多个进程在执行过程中争夺资源或相互通信造成的阻塞,这样它们就无法在没有外部力量的情况下继续执行。 此时,系统处于死锁状态或系统产生了死锁,这些总是相互等待的进程称为死锁进程。死锁的四个必要条件:①互斥条件:一个资源每次只能被一个线程使用。②请求和保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。③不可剥夺条件:线程已获得的资源,在未使用完之前,不能强行剥夺。④环路等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。解决死锁问题的方法是:一种是用synchronized,一种是用Lock显式锁实现。
Lock示例:
class MyTest implements Runnable {
private int tickets = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
lock.lock();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + " 售出第 " + tickets + " 张票");
tickets--;
} else {
System.out.println("票已售完!");
System.exit(0);
}
lock.unlock();
}
}
}
public class Test11 {
public static void main(String[] args) {
MyTest test = new MyTest();
Thread t1 = new Thread(test, "窗口一");
Thread t2 = new Thread(test, "窗口二");
Thread t3 = new Thread(test, "窗口三");
t1.start();
t2.start();
t3.start();
}
}
synchronized示例:
class MyTest1 implements Runnable {
private int tickets = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + " 售出第 " + tickets + " 张票");
tickets--;
} else {
System.out.println("票已售完!");
System.exit(0);
}
}
}
}
}
public class Test12 {
public static void main(String[] args) {
MyTest1 test = new MyTest1();
Thread t1 = new Thread(test, "窗口一");
Thread t2 = new Thread(test, "窗口二");
Thread t3 = new Thread(test, "窗口三");
t1.start();
t2.start();
t3.start();
}
}