java多线程笔试题---所有线程func1()执行完了,再执行func2()的实现

1.问题描述:

  某个类有2个方法func1(),func2(),有threadCount个线程,要求所有线程执行完func1(),再执行func2()。

2.分析:

  1)所有线程的func1()执行完的标准是什么?

  2)线程之间怎样共享变量?

3.代码实现

  1)源代码:

/**
 *
 */
package com.sunny.www.interview;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 所有线程执行完方法1,再执行方法2
 * @author sunny
 *
 */
public class Syn2Threads implements Runnable {
    private AtomicInteger threadCount;        

    public Syn2Threads(AtomicInteger threadCount) {
        super();
        this.threadCount = threadCount;
    }
    public AtomicInteger getThreadCount() {
        return threadCount;
    }
    public void setThreadCount(AtomicInteger threadCount) {
        this.threadCount = threadCount;
    }
    private void func1(){
        System.out.println(Thread.currentThread().getName() + " execute func1,threadCount=" + threadCount.decrementAndGet());

    }
    private void func2(){
        System.out.println(Thread.currentThread().getName() + " execute func2,threadCount=" + threadCount);
    }

    @Override
    public void run() {
        func1();
        synchronized(threadCount){
            while (0 < threadCount.get())  {
                try {
                    System.out.println(Thread.currentThread().getName() + " func1 not finished totally,threadCount=" + threadCount);
                    threadCount.wait();
                } catch (InterruptedException e) {
                    System.out.println(Thread.currentThread().getName() + " wait error");
                }
            }
            threadCount.notifyAll();
        }
        func2();
    }

    public static void main(String[] args) {
        int threadCount = 5;
        Syn2Threads syn2Threads = new Syn2Threads(new AtomicInteger(threadCount));
        for(int i = 1; i <= threadCount; i++){
            new Thread(syn2Threads,"thread-" + i).start();
        }
    }

}

  2)运行效果:

thread-2 execute func1,threadCount=4
thread-2 func1 not finished totally,threadCount=3
thread-1 execute func1,threadCount=3
thread-4 execute func1,threadCount=2
thread-4 func1 not finished totally,threadCount=2
thread-1 func1 not finished totally,threadCount=2
thread-5 execute func1,threadCount=1
thread-5 func1 not finished totally,threadCount=1
thread-3 execute func1,threadCount=0
thread-3 execute func2,threadCount=0
thread-5 execute func2,threadCount=0
thread-1 execute func2,threadCount=0
thread-4 execute func2,threadCount=0
thread-2 execute func2,threadCount=0
时间: 2024-12-28 13:47:44

java多线程笔试题---所有线程func1()执行完了,再执行func2()的实现的相关文章

java面试笔试题大汇总

java面试笔试题大汇总(一)JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),

15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只 是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并 发的.下面这些是我在不同时间不同地点喜欢问的

java多线程面试题整理及答案(2018年)

java多线程面试题整理及答案(2018年) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所

一线大厂面试官最喜欢问的15道Java多线程面试题

前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.现在引用Java5并发包关于并发工具和并发集合的问题正在增多.那些问题中ThreadLocal.Blocking Queue.Counting Semaphore和ConcurrentHashMap比较流行. Java多线程面试题及

Java 多线程(三) 线程的生命周期及优先级

Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处于创建状态. 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源. 2.可运行状态: 执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体——run()方法,这样就使得该线程处于可运行状态(Runnable). 这一

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

Java多线程之简单的线程同步实例

数据类: package Thread.MyCommon; public class Data { public int num = 0; public synchronized int getEven() { ++num; Thread.yield();//让另外线程先执行,加大测试效果几率 ++num; return num; } } 线程类: package Thread.MyCommon; public class myThread implements Runnable { priva

Java多线程之 -- 进程和线程

Java多线程之 – 进程和线程 概念 进程 程序的动态执行过程 包括占用的资源(内存.CPU)和线程 线程 线程是程序中最小的执行单位 一个进程有多个线程 线程共享进程的资源 进程和线程的区分 我们可以想象为进程为班级而线程是邦奇中得每一个学生 线程之间的交互 互斥,类似于每一个学生都为了第一名而你争我让,线程也是,都想抢占CPU的资源 同步,当举行运动会的时候,大家都团结一心,彼此共享自己的资源 Thread.Runnable Thread Introduction Thread 是Java

Java多线程:如何创建线程?

在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识,然后再阐述如何创建线程以及如何创建进程.下面是本文的目录大纲: 一.Java中关于应用程序和进程相关的概念 二.Java中如何创建线程 三.Java中如何创建进程 若有不正之处,请多多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/391351