Java教程 第31页
Java 实例 – 终止线程 Java 实例 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。 本文向大家介绍使用interrupt方法中断线程。 使用interrupt方法来终端线程可分为两种情况: (1)线程处于阻塞状态,如使用了sleep方法。 (2)使用while(!isInterrupted()){……}来判断线程是否被中断。 在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。 /* author by w3cschool.cn ThreadInterrupt.java */ public class ThreadInterrupt extends Thread { public void run() { try { sleep(50000); // 延迟50秒 } catch (InterruptedException e) { System.out.println(e.getMessage()); } } public static void main(String[] args) throws Exception { Thread thread = new ThreadInterrupt(); thread.start(); System.out.println("在50秒之内按任意键中断线程!"); System.in.read(); thread.interrupt(); thread.join(); System.out.println("线程已经退出!"); } } 以上代码运行输出结果为: 在50秒之内按任意键中断线程! sleep interrupted 线程已经退出! Java 实例
Java 实例 – 解析 URL Java 实例 以下实例演示了如何使用 net.URL 类的 url.getProtocol() ,url.getFile() 等方法来解析 URL 地址: /* author by w3cschool.cn Main.java */ import java.net.URL; public class Main { public static void main(String[] args) throws Exception { URL url = new URL("//www.w3cschool.cn/html/html-tutorial.html"); 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()); } } 以上代码运行输出结果为: URL 是 //www.w3cschool.cn/html/html-tutorial.html 协议是 http 文件名是 /html/html-tutorial.html 主机是 www.w3cschool.cn 路径是 /html/html-tutorial.html 端口号是 -1 默认端口号是 80 Java 实例
Java 实例 – 生产者/消费者问题 Java 实例 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。 以下实例演示了如何通过线程解决生产者/消费者问题: /* author by w3cschool.cn ProducerConsumerTest.java */ public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); } } class CubbyHole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notifyAll(); return contents; } public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; notifyAll(); } } class Consumer extends Thread { private...
Java 实例 – 网页抓取 Java 实例 以下实例演示了如何使用 net.URL 类的 URL() 构造函数来抓取网页: /* author by w3cschool.cn Main.java */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStreamReader; import java.net.URL; public class Main { public static void main(String[] args) throws Exception { URL url = new URL("http://www.w3cschool.cn"); BufferedReader reader = new BufferedReader (new InputStreamReader(url.openStream())); BufferedWriter writer = new BufferedWriter (new FileWriter("data.html")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); writer.write(line); writer.newLine(); } reader.close(); writer.close(); } } 以上代码运行输出结果为(网页的源代码,存储在当前目录下的 data.html 文件中): <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=11,IE=10,IE=9,IE=8"/>…… Java 实例
Java 实例 – 获取线程id Java 实例 以下实例演示了如何使用 getThreadId() 方法获取线程id: /* author by w3cschool.cn Main.java */ public class Main extends Object implements Runnable { private ThreadID var; public Main(ThreadID v) { this.var = v; } public void run() { try { print("var getThreadID =" + var.getThreadID()); Thread.sleep(2000); print("var getThreadID =" + var.getThreadID()); } catch (InterruptedException x) { } } private static void print(String msg) { String name = Thread.currentThread().getName(); System.out.println(name + ": " + msg); } public static void main(String[] args) { ThreadID tid = new ThreadID(); Main shared = new Main(tid); try { Thread threadA = new Thread(shared, "threadA"); threadA.start(); Thread.sleep(500); Thread threadB = new Thread(shared, "threadB"); threadB.start(); Thread.sleep(500); Thread threadC = new Thread(shared, "threadC"); threadC.start(); } catch (InterruptedException x)...
Java 8 函数式接口 Java 8 新特性 函数式接口(Functional Interface)就是一个具有一个方法的普通接口。 函数式接口可以被隐式转换为lambda表达式。 函数式接口可以现有的函数友好地支持 lambda。 JDK 1.8之前已有的函数式接口: java.lang.Runnable java.util.concurrent.Callable java.security.PrivilegedAction java.util.Comparator java.io.FileFilter java.nio.file.PathMatcher java.lang.reflect.InvocationHandler java.beans.PropertyChangeListener java.awt.event.ActionListener javax.swing.event.ChangeListener JDK 1.8 新增加的函数接口: java.util.function java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有: 序号 接口 & 描述 1 BiConsumer<T,U> 代表了一个接受两个输入参数的操作,并且不返回任何结果 2 BiFunction<T,U,R> 代表了一个接受两个输入参数的方法,并且返回一个结果 3 BinaryOperator<T> 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 4 BiPredicate<T,U> 代表了一个两个参数的boolean值方法 5 BooleanSupplier 代表了boolean值结果的提供方 6 Consumer<T> 代表了接受一个输入参数并且无返回的操作 7 DoubleBinaryOperator 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 8 DoubleConsumer 代表一个接受double值参数的操作,并且不返回结果。 9 DoubleFunction<R> 代表接受一个double值参数的方法,并且返回结果 10 DoublePredicate 代表一个拥有double值参数的boolean值方法 11 DoubleSupplier 代表一个double值结构的提供方 12 DoubleToIntFunction 接受一个double类型输入,返回一个int类型结果。 13 DoubleToLongFunction 接受一个double类型输入,返回一个long类型结果 14 DoubleUnaryOperator 接受一个参数同为类型double,返回值类型也为double 。 15 Function<T,R> 接受一个输入参数,返回一个结果。 16 IntBinaryOperator 接受两个参数同为类型int,返回值类型也为int 。 17 IntConsumer 接受一个int类型的输入参数,无返回值 。 18 IntFunction<R> 接受一个int类型输入参数,返回一个结果 。 19 IntPredicate :接受一个int输入参数,返回一个布尔值的结果。 20 IntSupplier 无参数,返回一个int类型结果。 21 IntToDoubleFunction 接受一个int类型输入,返回一个double类型结果 。 22 IntToLongFunction 接受一个int类型输入,返回一个long类型结果。 23 IntUnaryOperator 接受一个参数同为类型int,返回值类型也为int 。 24 LongBinaryOperator 接受两个参数同为类型long,返回值类型也为long。 25 LongConsumer 接受一个long类型的输入参数,无返回值。 26 LongFunction<R> 接受一个long类型输入参数,返回一个结果。 27...
Java 实例 – 获取 URL响应头的日期信息 Java 实例 以下实例演示了如何使用 HttpURLConnection 的 httpCon.getDate() 方法来获取 URL响应头的日期信息: /* author by w3cschool.cn Main.java */ import java.net.HttpURLConnection; import java.net.URL; import java.util.Date; public class Main{ public static void main(String args[]) throws Exception { URL url = new URL("http://www.w3cschool.cn"); HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); long date = httpCon.getDate(); if (date == 0) System.out.println("无法获取信息。"); else System.out.println("Date: " + new Date(date)); } } 以上代码运行输出结果为: Date: Mon May 04 11:57:06 CST 2015 Java 实例
Java 实例 – 线程挂起 Java 实例 以下实例演示了如何将线程挂起: /* author by w3cschool.cn SleepingThread.java */ public class SleepingThread extends Thread { private int countDown = 5; private static int threadCount = 0; public SleepingThread() { super("" + ++threadCount); start(); } public String toString() { return "#" + getName() + ": " + countDown; } public void run() { while (true) { System.out.println(this); if (--countDown == 0) return; try { sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } } } public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 5; i++) new SleepingThread().join(); System.out.println("线程已被挂起"); } } 以上代码运行输出结果为: #1: 5 #1: 4 #1: 3 #1: 2 #1: 1 …… #5: 3 #5: 2 #5: 1 线程已被挂起...
Java 8 默认方法 Java 8 新特性 Java 8 新增了接口的默认方法。 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。 我们只需在方法名前面加个default关键字即可实现默认方法。 为什么要有这个特性? 首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。 语法 默认方法语法格式如下: public interface vehicle { default void print(){ System.out.println("我是一辆车!"); } } 多个默认方法 一个接口有默认方法,考虑这样的情况,一个类实现了多个接口,且这些接口有相同的默认方法,以下实例说明了这种情况的解决方法: public interface vehicle { default void print(){ System.out.println("我是一辆车!"); } } public interface fourWheeler { default void print(){ System.out.println("我是一辆四轮车!"); } } 第一个解决方案是创建自己的默认方法,来覆盖重写接口的默认方法: public class car implements vehicle, fourWheeler { default void print(){ System.out.println("我是一辆四轮汽车!"); } } 第二种解决方案可以使用 super 来调用指定接口的默认方法: public class car implements vehicle, fourWheeler { default void print(){ vehicle.super.print(); } } 静态默认方法 Java 8 的另一个特性是接口可以声明(并且可以提供实现)静态方法。例如: public interface vehicle { default void print(){ System.out.println("我是一辆车!"); } // 静态方法 static void blowHorn(){ System.out.println("按喇叭!!!"); } } 默认方法实例 我们可以通过以下代码来了解关于默认方法的使用,可以将代码放入 Java8Tester.java 文件中: public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); } }...
Java 实例 – 查看主机指定文件的最后修改时间 Java 实例 以下实例演示了如何查看主机指定文件的最后修改时间: /* author by w3cschool.cn Main.java */ import java.net.URL; import java.net.URLConnection; public class Main { public static void main(String[] argv) throws Exception { URL u = new URL("http://127.0.0.1/java.bmp"); URLConnection uc = u.openConnection(); uc.setUseCaches(false); long timestamp = uc.getLastModified(); System.out.println("java.bmp 文件最后修改时间 :"+timestamp); } } 以上代码运行输出结果为: java.bmp 文件最后修改时间 24 May 2014 12:14:50 Java 实例