Java教程 第10页 Java线程教程 – Java多线程 以下代码显示了如何在程序中运行多线程。 public class Main { public static void main(String[] args) { // Create two Thread objects Thread t1 = new Thread(Main::print); Thread t2 = new Thread(Main::print); // Start both threads t1.start(); t2.start(); } public static void print() { for (int i = 1; i <= 500; i++) { System.out.println(i); } } } 上面的代码生成以下结果。 线程同步 Java编程语言内置了两种线程同步: 互斥同步 条件同步 在互斥同步中,在一个时间点只允许一个线程访问代码段。 条件同步通过条件变量和三个操作来实现:等待,信号和广播。 同步关键字 synchronized关键字用于声明需要同步的关键部分。 有两种方法可以使用synchronized关键字: 将方法声明为关键部分 将语句块声明为关键段 我们可以通过在方法的返回类型之前使用关键字synchronized来声明一个方法作为临界段。 public class Main { public synchronized void someMethod_1() { // Method code goes here } public static synchronized void someMethod_2() { // Method code goes here } } 我们可以声明一个实例方法和一个静态方法同步。构造函数不能声明为同步。 以下代码说明了使用关键字synchronized: public class Main { public synchronized void someMethod_1() { // only one thread can execute here at a time } public void...
2024-04-01
Class类的实例对象,用于记录类描述信息。 Class类没有公共的构造方法,无法通过new运算符实例化;只能通过对象的getClass方法,或是通过Class.forName(…)来获得实例。 方法 目的 static ClassforName(String className)throws ClassNotFoundException 使用参数className来指定具体的类,来获得相关的类描述对象,该方法有可能抛出类加载异常(ClassNotFoundException),必须捕捉 Class getSuperclass() 获得当前类描述对象的父类的描述对象 String getName() 返回当前类描述对象的类名称 获取Class对象的三种方式: public class _T11 { // Class:类描述对象 public static void main(String[] args) { Class<?> _class; // ***1*对象.getClass() String str = ""; _class = str.getClass(); System.out.println(_class + "-----对象名.getClass()"); // ***2*类.class _class = String.class; System.out.println(_class + "-----类名.class"); // ***3*Class.forName("") try { _class = Class.forName("java.lang.String"); System.out.println(_class + "-----Class.forName(...)"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } class java.lang.String—–对象名.getClass() class java.lang.String—–类名.class class java.lang.String—–Class.forName(…) Class类的常用方法: getName()一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 newInstance()Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。 getClassLoader()返回该类的类加载器。 getComponentType()返回表示数组组件类型的 Class。 getSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。 isArray()判定此 Class 对象是否表示一个数组类。
2024-04-01
Java反射 – Java方法反射 注:可先通过 java反射机制深入理解剖析 理解基础再学习本篇文章 java.lang.reflect.Method 类的实例表示一个方法。 java.lang.reflect.Constructor 类的实例表示一个构造函数。 方法和构造方法继承自一个通用的抽象超类可执行。 可执行文件中的参数由 Parameter 类的对象表示 Executable 类中的 getParameters() 方法获取所有参数作为 Parameter 的数组。 默认情况下,参数名称不存储在类文件中。 参数类的名称将类似于 arg0,arg1 等。 我们可以通过编译源来保存类文件中的实际参数名代码使用 -parameters 选项与 javac 编译器。 可执行文件中的 getExceptionTypes()方法类返回一个由 Executable 抛出的异常数组。 Executable 类的 getModifiers() 方法将修饰符作为int返回。 来自 Executable 类的 getTypeParameters() 方法返回一个 TypeVariable 数组,该数组表示通用方法或构造函数的类型参数。 例子 import java.lang.reflect.Constructor; import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Parameter; import java.util.ArrayList; class MyClass<T> { public MyClass(int i, int j, String s){ } public MyClass(T t){ } public int getInt(String a){ return 0; } } public class Main { public static void main(String[] argv){ Class<MyClass> cls = MyClass.class; for(Method m:cls.getMethods()){ System.out.println(m.getName()); System.out.println(getModifiers(m)); System.out.println(getParameters(m) ); System.out.println(getExceptionList(m)); } } public static ArrayList<String> getParameters(Executable exec) { Parameter[] parms = exec.getParameters(); ArrayList<String> parmList = new ArrayList<>(); for (int i =...
2024-04-01
JavaFX教程 – JavaFX ScrollPane 滚动窗口提供UI元素的可滚动视图。 我们使用可滚动面板,当我们需要显示有限的空间大内容。可滚动窗格具有将显示内容的一部分及其的视口必要时提供滚动条。 import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage stage) { stage.setWidth(500); stage.setHeight(500); Scene scene = new Scene(new Group()); VBox root = new VBox(); final WebView browser = new WebView(); final WebEngine webEngine = browser.getEngine(); ScrollPane scrollPane = new ScrollPane(); scrollPane.setContent(browser); webEngine.loadContent("<b>asdf</b>"); root.getChildren().addAll(scrollPane); scene.setRoot(root); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } } 上面的代码生成以下结果。 创建滚动窗格 以下代码从jpg文件创建一个图像并添加图像滚动到滚动窗格。 如果图像较大,滚动窗格将显示滚动条,我们可以使用它来查看隐藏的部分。 Image img = new Image(getClass().getResourceAsStream("yourImage.jpg")); ScrollPane sp = new ScrollPane(); sp.setContent(new ImageView(img)); 可滚动ScrollPane 调用setPannable(true)方法通过单击并移动鼠标光标来预览图像。 import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ScrollPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class Main extends Application { @Override public void...
2024-04-01
Java 实例 – 字符串分割 Java 实例 以下实例使用了 split(string) 方法通过指定分隔符将字符串分割为数组: //JavaStringSplitEmp.java 文件 public class JavaStringSplitEmp{ public static void main(String args[]){ String str = "www-youj-com"; String[] temp; String delimeter = "-"; // 指定分割字符 temp = str.split(delimeter); // 分割字符串 // 普通 for 循环 for(int i =0; i < temp.length ; i++){ System.out.println(temp[i]); System.out.println(""); } System.out.println("------java for each循环输出的方法-----"); String str1 = "www.w3cschool.cn"; String[] temp1; String delimeter1 = "\\."; // 指定分割字符, . 号需要转义 temp1 = str1.split(delimeter1); // 分割字符串 for(String x : temp1){ System.out.println(x); System.out.println(""); } } } 以上代码实例输出结果为: www youj com ------java for each循环输出的方法----- www w3cschool cn Java 实例
2024-04-01
Java subSequence() 方法 Java String类 subSequence() 方法返回一个新的字符序列,它是此序列的一个子序列。 语法 public CharSequence subSequence(int beginIndex, int endIndex) 参数 beginIndex — 起始索引(包括)。 endIndex — 结束索引(不包括)。 返回值 返回一个新的字符序列,它是此序列的一个子序列。 实例 public class Test { public static void main(String args[]) { String Str = new String("www.w3cschool.cn"); System.out.print("返回值 :" ); System.out.println(Str.subSequence(4, 10) ); } } 以上程序执行结果为: 返回值 :w3csch Java String类
2024-04-01
Java matches() 方法 Java String类 matches() 方法用于检测字符串是否匹配给定的正则表达式。 调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同: Pattern.matches(regex, str) 语法 public boolean matches(String regex) 参数 regex — 匹配字符串的正则表达式。 返回值 在字符串匹配给定的正则表达式时,返回 true。 实例 public class Test { public static void main(String args[]) { String Str = new String("www.w3cschool.cn"); System.out.print("返回值 :" ); System.out.println(Str.matches("(.*)youj(.*)")); System.out.print("返回值 :" ); System.out.println(Str.matches("(.*)google(.*)")); System.out.print("返回值 :" ); System.out.println(Str.matches("www(.*)")); } } 以上程序执行结果为: 返回值 :false 返回值 :false 返回值 :true Java String类
2024-04-01
Java流 – Java流统计 java.util包包含三个类来收集统计信息: DoubleSummaryStatistics LongSummaryStatistics IntSummaryStatistics 我们可以使用它们来计算任何数字数据组的摘要统计信息。 以下代码显示如何计算多个双精度值的统计信息。 import java.time.LocalDate; import java.time.Month; import java.util.Arrays; import java.util.DoubleSummaryStatistics; import java.util.List; public class Main { public static void main(String[] args) { DoubleSummaryStatistics stats = new DoubleSummaryStatistics(); stats.accept(100.0); stats.accept(300.0); stats.accept(230.0); stats.accept(532.0); stats.accept(422.0); long count = stats.getCount(); double sum = stats.getSum(); double min = stats.getMin(); double avg = stats.getAverage(); double max = stats.getMax(); System.out.printf( "count=%d, sum=%.2f, min=%.2f, average=%.2f, max=%.2f%n", count, sum, min, max, avg); } } 上面的代码生成以下结果。 count=5,sum=1584.00, min=100.00, average=316.80, max=532.00 流摘要统计 摘要统计类设计为与流一起使用。 它们包含组合两个摘要统计信息的combine()方法。 以下代码显示如何计算收入总结统计。 import java.time.LocalDate; import java.time.Month; import java.util.Arrays; import java.util.DoubleSummaryStatistics; import java.util.List; public class Main { public static void main(String[] args) { DoubleSummaryStatistics incomeStats = Employee.persons() .stream() .map(Employee::getIncome) .collect(DoubleSummaryStatistics::new, DoubleSummaryStatistics::accept, DoubleSummaryStatistics::combine); System.out.println(incomeStats); } } class Employee { public static enum Gender...
2024-04-01
Java endsWith() 方法 Java String类 endsWith() 方法用于测试字符串是否以指定的后缀结束。 语法 public boolean endsWith(String suffix) 参数 suffix — 指定的后缀。 返回值 如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true;否则返回 false。注意,如果参数是空字符串,或者等于此 String 对象(用 equals(Object) 方法确定),则结果为 true。 实例 public class Test { public static void main(String args[]) { String Str = new String("W3Cschool教程:www.w3cschool.cn"); boolean retVal; retVal = Str.endsWith( "youj" ); System.out.println("返回值 = " + retVal ); retVal = Str.endsWith( "cn" ); System.out.println("返回值 = " + retVal ); } } 以上程序执行结果为: 返回值 = false 返回值 = true Java String类
2024-04-01
Java线程教程 – Java线程中断 我们可以通过使用interrupt()方法中断一个活动的线程。 这个方法调用在线程只是一个指示。它是由线程如何响应中断。 例子 下面的代码显示了中断主线程并打印线程中断状态的代码。 public class Main { public static void main(String[] args) { System.out.println("#1:" + Thread.interrupted()); // Now interrupt the main thread Thread.currentThread().interrupt(); // Check if it has been interrupted System.out.println("#2:" + Thread.interrupted()); // Check again if it has been interrupted System.out.println("#3:" + Thread.interrupted()); } } 上面的代码生成以下结果。 例2 下面的代码如何一个线程将中断另一个线程。 public class Main { public static void main(String[] args) { Thread t = new Thread(Main::run); t.start(); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } t.interrupt(); } public static void run() { int counter = 0; while (!Thread.interrupted()) { counter++; } System.out.println("Counter:" + counter); } } 上面的代码生成以下结果。 例3 Thread类有一个非静态的isInterrupted()方法,可以用来测试一个线程是否被中断。 public class Main { public static void main(String[] args) { System.out.println("#1:" + Thread.interrupted()); Thread mainThread = Thread.currentThread();...
2024-04-01