`
xijunhu
  • 浏览: 155832 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

线程与内部类

阅读更多
昨天面试的一道上机题
我做错了
题目是这样的,设计4个线程,两个加1,两个减1。
当时由于不知道内部类怎么用,就把线程都写成静态的了,回来看了一下内部类的用法。写了一下:
public class Threads {
    static int j=0;
	public static void main(String[] args){
		Threads a= new Threads();
		for(int i=0; i<2;i++)
		{
		Threads.ThreadA threadA = a.new ThreadA();
		threadA.start();
		Threads.ThreadB threadB = a.new ThreadB();
		threadB.start();
		}
	}
	class ThreadA extends Thread{
		
		public void run(){
			j++;
			System.out.println("+++"+j);
		}
	}
	
	class ThreadB extends Thread{
	
		public void run(){
			j--;
			System.out.println("---"+j);
		}
	}
}


执行那个结果
+++1
+++2
---1
---0

用concurrent包,简单一点。
public class Threads {
    static int j=0;
	public static void main(String[] args){
		ExecutorService ex = Executors.newFixedThreadPool(4);
		// 加一
		for (int i = 0; i < 2; i++) {   
			
            Runnable task = new Runnable() {   
                public void run() {   
                     ++j;
                     System.out.println("++"+j);
                }   
            };   
            // 往线程池中添加任务,线程开始处理这些任务   
            ex.execute(task);   
        }   
		
		// 减 一
		for (int i = 0; i < 2; i++) {   
            Runnable task = new Runnable() {   
                public void run() {   
                     --j;
                     System.out.println("--"+j);
                }   
            };   
            // 往线程池中添加任务,线程开始处理这些任务   
            ex.execute(task);   
        }   
		
        // 关闭线程池,不会阻塞主线程的执行【这里是main线程】   
		ex.shutdown();   

	}		
}


执行结果是
++2
++1
--1
--0

上面的是否有上面问题,哪位给指正一下。
发现,概念的东西记得再多,也不及亲自动手实践。

补充:对于thread和runnable的区别一直只限于,一个是继承thread类,一个是现实runnable接口,重来没有注意他们的创建的不同
ThreadA a = new ThreadA(); //Runnable实现
Thread myThread = new Thread(a);
myThread.start();

ThreadB b= new ThreadB(); //Thread实现
b.start();
分享到:
评论

相关推荐

    使用内部类实现线程

    总之,内部类是Java中实现线程的一种灵活且强大方式,它允许我们轻松地创建线程并与其他代码进行紧密交互。理解和掌握这种技术对于进行高效的多线程编程至关重要。在实际应用中,我们还需要考虑线程安全、同步机制...

    java线程内部类练习.rar

    在提供的"java线程内部类练习.rar"压缩包中,可能包含了几个示例,如"12"、"10"和"11",这些文件很可能是Java源代码文件,分别展示了不同的线程内部类使用场景。通过学习和分析这些代码,我们可以更好地理解和掌握...

    线程管理工具类

    这可能意味着这个工具类内部维护了一个线程池,`execute()`方法将提交的任务放入线程池,由线程池负责调度和执行。 基于以上信息,我们可以推测`ThreadManager.java`文件可能包含以下内容: 1. `ThreadManager`类...

    易语言类内部多线程

    易语言类内部多线程源码,类内部多线程,call,StartClass,类_取类指针,类_取类成员指针,CreateThread_class,方法1,方法2,方法3,方法4,取类指针,qqq,zzz,CreateThread,CloseHandle,HeapAlloc,HeapFree,GetProcessHeap,...

    创建线程类轻松实现线程管理

    - **中断线程**:通过调用`interrupt()`方法可以请求线程停止执行,但实际停止需要线程内部配合检查`isInterrupted()`或捕获`InterruptedException`。 - **死锁**:当两个或更多线程相互等待对方释放资源而造成的一...

    易语言类方法的获取以及类线程

    本篇文章将深入探讨易语言中的类方法获取与类线程的实现,以及相关的关键技术。 首先,我们要理解"GetThis"这个概念。在易语言中,`GetThis`是一个关键字,用于获取当前执行上下文的对象引用。当你在类的方法内部...

    java中的匿名内部类总结

    匿名内部类广泛应用于多线程编程中,例如Thread类和Runnable接口的实现。匿名内部类也可以用来实现抽象方法和接口。 实例 1: 不使用匿名内部类来实现抽象方法 在这个例子中,我们定义了一个抽象类Person,并且在...

    java中的多线程内部类实现数据共享和Runnable实现数据共享归类.pdf

    - **数据共享**:与`Runnable`接口类似,内部类也可以实现数据共享。`InnerThread`类的实例在`NewThread`对象中创建,并通过`getThread()`方法返回。每个`NewThread`实例的`InnerThread`对象都有自己的`index`变量...

    MFC多线程的创建,包括工作线程和用户界面线程

    - **工作者线程**(Worker Thread):这类线程主要用于执行耗时的操作,例如复杂的计算或者数据处理,这些操作不需要直接与用户界面交互,因此不需要消息循环。 #### 三、CWinThread类详解 ##### 3.1 CWinThread类...

    java线程与并发编程实践

    它们内部实现了线程安全的更新策略,能够在高并发环境下保证数据一致性。 异常处理在多线程编程中同样重要。线程的中断(interrupt())和检查中断状态(isInterrupted()、interrupted())是处理异常情况的关键。...

    WinForm后台线程与UI线程通讯

    这样编译器会自动处理线程同步,但注意不要在UI方法(如按钮点击事件)内部直接await,应将await放在一个异步方法中。 5. **事件驱动**:自定义事件也可以用于线程间通信,但这种方法通常比上述方法更复杂,需要...

    java中的多线程内部类实现数据共享和Runnable实现数据共享借鉴.pdf

    本篇将探讨两种在Java中实现多线程数据共享的方式:通过内部类和实现`Runnable`接口。 首先,让我们来看看如何使用`Runnable`接口实现数据共享。`Runnable`接口是Java提供的一种创建线程的方式,它允许我们将线程的...

    内部类代码

    4. 静态内部类:静态内部类与普通成员内部类相似,但可以通过外部类直接实例化,不依赖外部类的对象。它们不能直接访问外部类的非静态成员,但可以通过实例化外部类对象来访问。 二、内部类的用途 1. 数据封装:...

    java中的内部类

    6. 内部类与多线程:内部类在多线程编程中也发挥了重要作用,因为它可以轻松地实现线程的封装。比如,可以定义一个内部类实现Runnable接口,然后创建Thread对象来启动新线程。 7. 内部类与继承:内部类可以继承任何...

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    浅谈C#跨线程调用窗体控件引发的线程安全问题 C#跨线程调用窗体控件时可能会引发线程安全问题,例如当多个线程操作同一个控件时,该控件可能会进入不一致的状态,出现争用情况和死锁等问题。因此,确保以线程安全...

    C#模仿迅雷的多线程下载类

    C#模仿迅雷的多线程下载类提供了强大的下载功能,通过对代码的深入分析,我们可以理解其内部机制,并在此基础上进行优化和扩展,以满足不同的下载需求。无论是对于个人项目还是企业级应用,掌握多线程下载技术都将...

    C++类中创建多线程实现本地和远程打印

    2. **线程同步与通信**:为了确保数据安全和避免竞态条件,多线程程序通常需要使用互斥量(`std::mutex`)、条件变量(`std::condition_variable`)或者信号量(`std::semaphore`)等工具进行同步。在`print.cpp`中...

    易语言源码易语言类内部多线程源码.rar

    易语言源码易语言类内部多线程源码.rar 易语言源码易语言类内部多线程源码.rar 易语言源码易语言类内部多线程源码.rar 易语言源码易语言类内部多线程源码.rar 易语言源码易语言类内部多线程源码.rar 易语言源码...

Global site tag (gtag.js) - Google Analytics