一、线程池的应用:
public class TestThread implements Runnable {
private String name;
public TestThread(String name) {
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000 * 3);
} catch (Exception ex) {
}
System.out.println("正在执行:" + this.name);
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
public static void main(String[] args) {
// 创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(1);
// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
for (int i = 0; i < 20; i++) {
TestThread t1 = new TestThread(i + "");
// 将线程放入池中进行执行
pool.execute(t1);
}
// 关闭线程池
pool.shutdown();
}
}
二、线程的应用:
public class ThreadDemo{
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("正在执行:" + i);
}
}
}.start();
}}
三、委托的应用:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public abstract class Delegator implements InvocationHandler {
protected Object obj_orgin = null; // 原始对象
protected Object obj_proxy = null; // 代理对象
public Delegator() {
}
public Delegator(Object orgin) {
this.createProxy(orgin);
}
/*
* 完成原始对象和委托对象的实例化
*
* @param orgin 原始对象实例
*/
protected Object createProxy(Object orgin) {
obj_orgin = orgin;
// 下面语句中orgin.getClass().getClassLoader()为加载器,orgin.getClass().getInterfaces()为接口集
obj_proxy = Proxy.newProxyInstance(orgin.getClass().getClassLoader(), orgin.getClass().getInterfaces(), this); // 委托
return obj_proxy;
}
/*
* 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法,具体请参见Java API
*
* @param args 参数
*
* @param method 方法类实例
*/
protected Object invokeSuper(Method method, Object[] args) throws Throwable {
return method.invoke(obj_orgin, args);
}
// --------------实现InvocationHandler接口,要求覆盖------------
// 下面实现的方法是当委托的类调用toString()方法时,操作其他方法而不是该类默认的toString(),这个类的其他方法则不会。
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
// 缺省实现:委托给obj_orgin完成对应的操作
if (method.getName().equals("toString")) { // 对其做额外处理
return this.invokeSuper(method, args) + "$Proxy";
} else { // 注意,调用原始对象的方法,而不是代理的(obj==obj_proxy)
return this.invokeSuper(method, args);
}
}
}
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
@SuppressWarnings("rawtypes")
public class Delegator4Map extends Delegator {
//private static Log _log = LoggerFactory.getLog(Delegator4Map.class);
private Map orginClass = null; // 原始对象
private Map proxyClass = null; // 代理对象
public Map getOrgin() {
return orginClass;
}
public Map getProxy() {
return proxyClass;
}
public Delegator4Map(Map orgin) {
super(orgin);
orginClass = orgin;
proxyClass = (Map) super.obj_proxy;
}
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
if (method.getName().equals("size")) { // 修改size处理逻辑
Object res2 = new Integer(-1);
System.out.println("调用委托的方法");
return res2;
} else {
System.out.println("调用原始的方法");
return super.invoke(obj, method, args);
}
}
public static void main(String[] args) throws IOException {
Delegator4Map rtm = new Delegator4Map(new Hashtable());
Map m = rtm.getProxy();
m.size();
}
}
分享到:
相关推荐
在Java中,线程间通信是通过共享内存(变量)和同步机制(如synchronized关键字、wait/notify机制)来实现的。例如,如果这个示例是银行转账操作,那么两个线程分别代表不同的账户,它们需要在修改余额时进行同步,...
在C#编程中,委托、线程和事件是三个核心概念,它们对于构建高效、响应式的多任务应用程序至关重要。下面将详细阐述这三个概念及其相互之间的关系,并通过一个实例代码进行说明。 1. 委托(Delegate): 委托在C#中...
压缩包中的“c#一个简单的线程事例代码”文件很可能是包含一个简单示例项目,包括一个窗体,一个按钮,以及当按钮被点击时启动线程并使用委托更新UI的代码。 总结来说,这个实例将教我们如何在C#中创建线程,以及...
在Java中,为了保证线程安全,避免数据竞争和不一致的状态,我们通常会使用同步机制来控制对共享资源的访问。本文将通过一个具体的售票系统实例来深入解析Java中的线程同步。 首先,我们要了解Java中的关键字`...
本示例程序以“多线程程序事例”为主题,通过使用Windows API中的`WaitForMultipleObjects`函数来确保线程的安全退出,从而避免了资源泄露和其他潜在的问题。 多线程允许程序同时执行多个独立的任务,提高系统的...
Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,
在C#编程中,多线程技术是一种关键的性能优化手段,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本资源“C# 多线程开发源码事例”聚焦于如何在WINFORM应用中实现多线程操作。WINFORM是.NET ...
本文将深入探讨Qt中的线程概念、如何创建和管理线程,以及如何在实际应用中使用线程。 首先,让我们理解什么是线程。线程是程序执行的最小单元,每个线程都有自己的程序计数器、系统寄存器和栈。在单个进程中,可以...
总的来说,"Bcb简单多线程事例"是一个很好的起点,通过实践这个示例,我们可以深入理解如何在Bcb中创建和管理线程,以及如何利用线程提高程序的性能。随着经验的积累,你将能够更熟练地应对复杂的多线程问题,如线程...
6. **异常处理**:Java中的异常处理机制使得程序能优雅地处理错误情况,通过try-catch-finally块捕获和处理异常。 7. **输入输出流**:Java的I/O流系统支持读写文件、网络通信等各种数据传输。理解流的概念以及...
在Java编程中,JNI(Java Native Interface)是一个关键特性,允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的代码或者利用特定硬件功能时非常有用。在本例“Jni多线程同步事例”中,我们将探讨如何在...
java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200java 编程事例 1200
java类的描述和使用,讲述了一段java代码的类的构成。
- Java中的变量用于存储不同类型的数据。 - 常见的数据类型包括:整型(`int`)、浮点型(`float`、`double`)、字符型(`char`)等。 - 示例代码: ```java int age = 20; double height = 1.75; char ...
在C#编程中,多线程是一个核心概念,它允许应用程序同时执行多个任务,从而提高系统效率和响应性。这个“C#多线程整合事例程序”很可能包含了一系列示例,展示了如何在C#环境中有效地利用多线程技术。 在C#中,多...
在学习这个实例时,你将有机会接触到Java的`java.net.Socket`和`java.net.ServerSocket`类,以及多线程相关的`java.lang.Thread`或`java.util.concurrent`包中的线程池。你还需要理解如何正确地管理线程资源,避免...
下面我们将详细讨论Java中的"Hello, World!"实例,以及它背后的原理。 首先,我们需要了解Java程序的基本结构。Java程序由一个或多个类(Class)组成,每个类可以包含方法(Method)和变量(Field)。在"Hello, ...
在Java中,包(package)是一种将相关类和接口进行逻辑分组的方式,便于管理和重用代码。"com"通常是商业组织或公司的顶级包名,例如,"com.example"可能代表一个名为"example"的公司的代码库。 在Java编程中,学习...
在这个“java Socket心跳事例”中,我们将会深入探讨如何使用Java的Socket编程来实现心跳机制,这是一种确保连接可靠性和有效性的常见策略。 心跳机制的基本思想是,两个通信端点定期交换信息,以确认连接仍然有效...
【描述】中的"事例集合1(转载)"表明这些内容可能来源于网络,可能是某个开发者或教育者收集并整理的Java编程实例,目的是帮助学习者通过实际操作来理解Java编程。而"看韩剧www.pigkrtv.com"这部分看起来像是无关的...