求帅哥帮忙.我配置了一个线程池一直注入不进去。求大神帮忙看看

package com.test.test;

import java.util.concurrent.ThreadPoolExecutor;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.task.TaskExecutor;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import org.springframework.stereotype.Component;

//@Configuration
@Component
public class ThreadConfig {

//线程池维护线程的最少数量
@Value("${ThreaPool.corePoolSize}")
private Integer corePoolSize;
//允许的空闲时间
@Value("${ThreaPool.keepAliveSeconds}")
private Integer keepAliveSeconds;
//线程池维护线程的最大数量
@Value("${ThreaPool.maxPoolSize}")
private Integer maxPoolSize;
//缓存队列

@Value( "${ThreaPool.queueCapacity}")

private Integer queueCapacity;

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(corePoolSize);
    executor.setKeepAliveSeconds(keepAliveSeconds);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setQueueCapacity(queueCapacity);
    ThreadPoolExecutor.CallerRunsPolicy callerRunsPolicy = 
            new ThreadPoolExecutor.CallerRunsPolicy();
    //对拒绝task的处理策略
    executor.setRejectedExecutionHandler(callerRunsPolicy);
    executor.initialize();
    return executor;
}

}

package com.test.test;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.junit.jupiter.api.Test;

public class b {
    @Resource
    private ThreadConfig es;
    @Test
    public void test1() {
        List<Integer> integers=new ArrayList<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        integers.add(4);
        integers.add(5);
        integers.add(6);
        integers.add(7);
        integers.add(8);
        integers.add(9);
        integers.add(10);
        integers.add(11);
        integers.add(12);
        integers.add(13);
        integers.add(14);
        integers.add(15);
        System.out.println(integers);
        System.out.println(es==null);
        List<List<Integer>> lists=averageAssign(integers, 6);
        for (int j = 0; j <lists.size(); j++) {
            List<Integer> lisrrr=lists.get(j);
            System.out.println(es==null);
        if(lisrrr!=null) {
            System.out.println("1");
            es.taskExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("1");

                    try {
                        System.out.println(lisrrr);
    System.err.println(Thread.currentThread().getName());
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();

                    }

                }
            }); 
            }
        }

    }

}


现在运行的时候打印出来的执行到 es.taskExecutor().execute(new Runnable()就是空指针异常,打印System.out.println(es==null); 也是true。求大神帮忙看看是哪里写错了

2个回答

获取下,IOC容器,看看你得dataSource有没有注入进去,

public class b 这类上面应该需要加上 Spring 的配置注解,类似这样的 :

@ContextConfiguration(locations = { "classpath:config/applicationContext-mvc.xml",
        "classpath:config/applicationContext.xml"})
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求帅哥帮忙.添加一个线程池,配置文件写好了,怎么才能让ThreadPoolTaskExecutor知道我的配置信息是什么?
@Configuration @PropertySource("classpath:application-dev.yml") public class ThreadConfig { //线程池维护线程的最少数量 @Value("${ThreaPool.corePoolSize}") private Integer corePoolSize; //允许的空闲时间 @Value("${ThreaPool.keepAliveSeconds}") private Integer keepAliveSeconds; //线程池维护线程的最大数量 @Value("${ThreaPool.maxPoolSize}") private Integer maxPoolSize; //缓存队列 @Value( "${ThreaPool.queueCapacity}") private Integer queueCapacity; @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setKeepAliveSeconds(keepAliveSeconds); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); ThreadPoolExecutor.CallerRunsPolicy callerRunsPolicy = new ThreadPoolExecutor.CallerRunsPolicy(); //对拒绝task的处理策略 executor.setRejectedExecutionHandler(callerRunsPolicy); executor.initialize(); return executor; } } ``` 我用spring boot 添加了一个线程池 我把上面写bean注入进来了 ,注入的信息不是我配置的信息 我配置的这个线程池要怎么使用 import org.springframework.core.task.TaskExecutor; @Autowired public TaskExecutor taskExecutor; ```
线程池已经关闭,但是每次使用完,项目总线程数总是多两条,线程池已经关闭
newFixedThreadPool()方式创建线程池,不管我创建的池子是多大的,每次我调用多线程跑完自己的需求,项目中总是会多出2条线程, 我的关闭线程池顺序: .shutdown 并且用while(true){ if (.isTerminated()){ break;}}等待线程池关闭,接 着还有.shutdownNow() 然后接着还有: .awaitTermination(20, TimeUnit.SECONDS) 执行完,我看项目里面活着的线程,总是每执行一次就多两条线程在里面,不管我执行跑多少数据,或者说我把池子设置成多大,都是多两条,大佬们....这个怎么搞啊
Springmvc在线程池中无法使用Service
问题:我在项目中使用线程池新建了线程列队,controller请求后把耗时任务交给列队处理, 列队中需要service注入,但是在Test中测,子线程无法使用service的方法,代码如下: TaskQueueHandler.java ``` public interface TaskQueueHandler { String getTaskName(); int doInvoke(); } ``` TaskSerialQueueService.java ... ``` @PostConstruct public void init(){ serviceThreadStatus=service.submit(new Thread(new Runnable() { @Override public void run() { while (running){ try{ TaskQueueHandler taskQueueHandler= tasks.take(); if(taskQueueHandler!=null){ try{ taskQueueHandler.doInvoke(); }catch (Exception e){ log.error(taskQueueHandler.getTaskName()+" doInvoke Error!",e.getCause()); } } }catch (InterruptedException e){ running=false; } } } })); } /** * 往列队中添加新任务 * @param taskQueueHandler * @return */ public synchronized boolean addTask(TaskQueueHandler taskQueueHandler){ if(!checkServiceIsActive()){ activeService(); } boolean success= tasks.offer(taskQueueHandler); if(!success){ log.warn(taskQueueHandler.getTaskName()+"任务列队添加失败!"); } return success; } ``` ... WxPayNotifyTask.java ``` public class WxPayNotifyTask implements TaskQueueHandler{ private String orderNo; public WxPayNotifyTask(String mOrderNo){ this.orderNo=mOrderNo; } @Override public String getTaskName() { return WxPayNotifyTask.class.getSimpleName(); } private OrderService orderService; @Override public int doInvoke() { System.out.println("orderNo="+orderNo); orderService= (OrderService)SpringUtils.getBean("orderService"); try{ OrderBean orderBean=orderService.queryByOrderNo(orderNo); System.out.println(orderBean.toString()); }catch (Exception e){ e.printStackTrace(); } return 0; } } ``` 测试代码中调用 ``` @Autowired private TaskSerialQueueService taskQueueService; taskQueueService.addTask(new WxPayNotifyTask("379991638464417792")); ``` 测试发现报错信息如下 ``` org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: interrupt at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:289) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:461) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) at com.superior.chalk.service.order.OrderServiceImpl$$EnhancerBySpringCGLIB$$d45a5b10.queryByOrderNo(<generated>) at com.superior.chalk.task.WxPayNotifyTask.doInvoke(WxPayNotifyTask.java:27) at com.superior.chalk.task.queue.TaskSerialQueueService$1.run(TaskSerialQueueService.java:35) at java.lang.Thread.run(Thread.java:745) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.sql.SQLException: interrupt ``` 最后发现如直接在test中使用 new WxPayNotifyTask("379991638464417792").invoke()是可以使用service的,但是在子线程中能获取到service但调用service的方法就报错。 先谢谢各位大佬帮忙分析分析!
DeferredResult和多线程开发有什么区别?分别的使用场景?DeferredResult需不需要和线程池配合使用?
DeferredResult和多线程开发有什么区别?分别的使用场景?DeferredResult需不需要和线程池配合使用?
c++11 线程池,子线程的运行导致同时运行的父线程的代码块耗时增加
copy了Github上一段c++11线程池的代码,看着很多人用<br> https://github.com/progschj/ThreadPool<br> <br> cpu: i5-8500桌面版<br> <br> 本意是想使用子线程去做一个大块内存的memset工作,主线程做计算,使得计算和内存初始化异步执行<br> <br> 但是现在将memset的任务分给一个子线程后(即将memset任务添加到线程池的任务队列里面),紧接着的主线程代码耗时就会增加(增加非常明显,且这段代码不访问正在子线程初始化的的内存块),如果不使用子线程,或则等待子线程计算完再开始主线程的计算,就没有这个问题。<br> <br> 问题太大,导致多线程比单线程还慢<br> <br> 考虑过是不是cache竞争的问题,我打印了主线程和子线程分配的cpu,两个线程不在同一个cpu上面,而且我的cpu没有共用L1Cache,感觉可以排除L1dcache竞争的问题
java线程,spring 线程池
大家好: 我现在有几个疑惑的地方 1、如果使用spring 线程池,或者java自带的线程池,那应用程序中的所有线程都 受到创建的这个线程池管理,还是只通过线程池.execute加进去的才被管理。 2、spring MVC 线程池threadPoolTaskExecutor, 配置了最少活跃线程10个,最大10个, 那如果线程池中已经有10个活跃的线程在执行,如果继续往线程池中execute,此时的线程 是出于等待,还是直接挂掉,这个spring的线程池有配置项做这个么。 3、如果一个线程new出对象,没有start()或者没有加入到线程池中,那么此时这个new出的 线程对象浪费资源么,结束 难道就是java内存回收时么? 请大家帮我指明一下,小弟在此谢过。C币不多,聊表谢意。
dubbo线程池问题,线程数一直增长
dubbo应用线程数一直在增加不释放,dubbo:provider 默认采用fixed线程池实现,默认线程池数为100,但DubboServerHandler线程是为150多 处于WAITING状态,正常吗,总不能这样一直增下去,求解?
计算1-x内的素数, 使用y个线程计算
计算1-x内的素数, 结果保存在mysql中 要求: 1. 使用y个线程计算 2. 尽量优化算法 3. x和y可配置 我是用的mvc写的 下面是线程池和素数计算方式 写到这里写不下去了,求帮助 package com.lsszss; import com.lsszss.service.Impl.PrimeImpl; import com.lsszss.service.PrimeService; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; /** * @ClassName Threads * @Author 25788 * @Date 2019/12/20 11:52 * @Version V1.0 * java.util.concurrent.Executors :线程池的工厂类,用来生成线程池 * 01.使用线程池的工厂类Executros里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池 * 02.创建一个类,实现Runnable接口,重写run方法,设置线程任务 * 03.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法 * 04.调用ExecutorService中的方法shutdown销毁线程池(不建议使用) */ public class prime { static PrimeService primeService= new PrimeImpl(); private static List<Integer> getPrimeNumber(int num){ List<Integer> arrayList = new ArrayList<>(); for (int i = 1;i < num+1 ; i++){ if (isPrime(i)){ arrayList.add(i); primeService.addPrime(Long.parseLong(i+"")); } } return arrayList; } public static boolean isPrime(int n){ if (n==2||n==3){ return true; } if (n%2==0){ // 是偶数就一定不是素数 return false; } for (int i=3;i<=(int)Math.sqrt(n);i=i+2){ // 奇数+1为偶数,所以每次循环+2 if (n%i==0) {return false;} } return true; } public static void main(String[] args) { int x=100; //1 - x 之间的素数 int y=2; //线程数 System.out.println(getPrimeNumber(x)); // 01.使用线程池的工厂类Executros里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池 ExecutorService executor = Executors.newFixedThreadPool(y); // 03.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法 executor.submit(new PrimeThread()); executor.submit(new PrimeThread()); executor.submit(new PrimeThread()); executor.submit(new PrimeThread()); executor.submit(new PrimeThread()); } }
ScheduledExecutorService线程池,如何停止线程池中某一线程?
我用的ScheduledExecutorService线程池做计划任务,定时用线程池提交日志,之前要判断队列里是否有日志信息,如果有,提交日志。没有,就终止该线程。现在我用interrupt和yiled停止不了这个线程,用stop的话整个线程池都停了。各位大佬帮帮忙
使用多个线程池还是一个线程池
最近在技术理论上遇到一个问题,不知道怎么解决。 问题描述:我们交易平台有4个商品(A、B、C、D)需要进行现在交易,交易的核心方法dealorder是 一个加了锁和事务的方法,而且该类是针对每一个商品的,即最多同时可以执行4个dealOrder方法,即每个商品执行一个该方法。 ``` @Transactional public synchronized Message dealOrder() ``` CPU核心数是固定的,假如为6核心,目前就存在一个问题, 情况1:假如说创建一个线程池,过来了大量的A商品请求,超过6个就被放进了队列中,再过来B、C、D商品的请求,也无法再进行处理。 情况2:假如说创建6个线程池,每个商品一个线程池,这时候,理论上ABCD四个商品就会在各自的线程池中进行处理,这样就不会发上1情况的其他商品等待资源释放的问题,但是真实情况下,6个线程池会去抢占一个CPU获得处理还是自动获取6个CPU核心数进行处理. 我现在没有理论上的经验,通过实践似乎可以看出来2情况要理想,但是真实情况下是否如此,真心需要理论上给出结论。
Java 线程池执行完毕之后的任务还能把自己扔回到线程池吗?
有个需求 1.单个任务放到线程池里去运行 2.任务运行完毕之后把自己重新塞回到线程池 3.外部信号决定单个任务是否停止将自己塞回线程池 应该是用定长线程池
scheduledthreadpool 开启了周期任务,怎么停止但不关闭线程池??
scheduledthreadpool 开启了周期任务,怎么停止但不关闭线程池??
java怎样捕获其他线程的异常
现在有个问题,我这边调用一个方法,这个方法是封装好的,我没法修改,方法里面会创建线程池异步执行,但是有个问题,由于线程池中执行的线程和我调用方法的线程不是同一个,导致一旦出现了异常我没法抓到,这个咋办呢?
多线程抢占资源问题求解答!
如何让5个线程都出现在结果上,(一般只有1,2线程抢,就结束了) ![图片说明](https://img-ask.csdn.net/upload/202001/15/1579075497_45371.png)
Java利用线程池周期性的执行100个线程同时去ping
Java利用线程池周期性的执行100个线程同时去ping主机,并将结果存到两个list中,一个是可以ping通的,一个是不能ping通的!请教高手!
tomcat 是一个请求产生一个线程吗?如果不是那ThreadLocal不是有问题
我研究了半天也没有解决,请问一个请求时会产生一个线程吗?(我之前一直这么以为的)...但我去获取线程id或name时候发现不是的。然后网上也有些人说不是的,因为有线程池,他在服务器启动的时候就会先创建几个线程。那我就是有迷茫了,那我们之前用的ThreadLocal,如果不是每次请求都会产生一个线程,有些可能不同的请求用的是同一个线程,那ThreadLocal不是失去它的意义了????求解
Python多线程通信问题
新人第一次提问, 最近在学习Python多线程, notify()与wait()语句。这是我写的一个作业, 要求是: 现在的你,是一个农场主。农场中养着10头小牛,牛吃草长大,但只有当下雨的时候草才会长大,每天有20%的概率下雨,草经过3次成长后就可以喂给牛吃了。每头小牛吃过5次草之后就会长大了。要求使用多线程来完成。小牛(消费者)线程和草(生产者)之间需要通信。 以下是我的代码: ``` import threading import random from time import sleep """ 声明全局变量: num_cows: 牛的数量, 整形,十头。 cows: 牛的集合, 列表(数组)。 长度:10 num_grass: 草的数量, 整形,若干。 区间:50-101棵。 为了确保每头牛都可以长大,小草必须至少有50棵。 grass: 草的集合, 列表(数组)。 长度:num_grass initial_stat: 草/牛的初始状态,整形,设置为0。 increment: 用于改变状态的变量,整形,设置为0。 """ # 定义全局变量 num_cows, initial_stat, num_grass = 10, \ 0, \ random.randint(50, 101) cows, grass = [], [] for i in range(num_grass): # 设置草儿数量,初始化每一棵小草状态 grass.append(initial_stat) for i in range(num_cows): # 初始化每一头牛 cows.append(initial_stat) # TODO 草儿生长类 class GrassGrow(threading.Thread): """草成长线程""" # TODO 重写run函数 def run(self): global grass global cows while True: ct.acquire() print("一天过去了...小草会不会生长呢?") grass = rain(grass) # 淋雨的草儿成长一次,数位进一, 呼叫rain函数, 传入参数grass列表 if len(grass) > 0: # 判断还有没有需要生长的草儿 if grassgrow(grass): # 检查草儿,若有一株淋到三次雨,通知牛儿吃草 print("提醒牛儿该吃草了") ct.notify() # 提醒牛儿线程该吃草了 ct.release() print("草线程解锁") sleep(1) print("通知牛儿吃草了") elif len(grass) <= 0: # 如果草儿被吃完了,结束进程 print("草儿被吃光啦") ct.release() # 解锁 break # 退出程序 # TODO 牛儿生长类 class CowGrow(threading.Thread): """牛儿成长线程""" print("start") # TODO 重写run函数 def run(self): print("1") global cows global grass # TODO 随机一头牛吃草 while True: print("2") ct.acquire() print("3") ct.wait() print("4") if grassgrow(grass) and 5 not in cows: print("牛有草能吃了") # 长大的小草中,随机吃掉一株,从草儿列表中移除 index = [] for i in range(len(grass)): if grass[i] >= 3: index.append(i) delete = index[random.randint(0, len(index) - 1)] del grass[delete] cows[random.randint(range(len(cows)))] += 1 # 随机一头牛吃草,状态进1 print("有一头牛把吃了一颗草,现在的牛儿们是:{}".format(cows)) # 判断牛儿中是否有长大的牛儿 elif 5 in cows: # 移除所有已经长大的牛儿 for cow in range(len(cows)): if cows[cow] == 5: del cows[cow] # 判断是不是所有的牛儿都长大了,如果都长大了,结束进程 elif len(cows) == 0: print("所有的牛儿都长大啦") ct.release() break ct.wait() ct.release() # sleep(1) # TODO 下雨函数 def rain(grass_list): """ :param grass_list: 接收 草儿列表作为参数 :return: 返回 新的,淋雨之后的草儿列表 """ # 遍历草列表中的每一株草 rain_probability = random.randint(1, 101) # 每天有20%几率局部下雨。如果未下雨,则所有小草都不会成长。如果下雨了,局部小草会成长。 if rain_probability <= 20: for a_grass in range(len(grass_list)): grass_grow_prob = random.randint(1, 101) if grass_grow_prob <= 50 and 0 <= grass_list[a_grass] <= 2: grass_list[a_grass] += 1 print("今天下雨啦,现在的小草们:{}".format(grass)) print("今天没有下雨,没有小草生长...") return grass_list # TODO 判断草长大函数 def grassgrow(grass_list): """ :param grass_list: 接收 草儿列表作为参数 :return: 返回 若有生长好的小草则返回真,否则为假 """ if 3 not in grass_list: print("目前为止还没有小草生长完成") return False else: print("有小草生长完成了,现在的小草们:{}".format(grass)) return True if __name__ == "__main__": ct = threading.Condition() # 定义线程变量, 用于多线程通信 cow_thread = CowGrow() grass_thread = GrassGrow() cow_thread.start() print("牛等待吃草") grass_thread.start() ``` rain函数用来20%几率下雨, grasgrow函数用来判断有没有草淋了三次雨, 一旦有草淋到三次雨就可以了通知CowGrow线程吃草了。 我的解题思路是: 创建一个列表grass代表草, 一个列表cows代表牛。类GrassGrow中当判断grassgrow函数为真时, 唤醒牛线程。然后随机一头牛吃了一颗草之后,阻塞自己等待。而当我实际运行的时候,牛在一开始被阻塞之后一直没有被唤醒 以下是运行结果: ============================================= start 1 2 3牛等待吃草 一天过去了...小草会不会生长呢? 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天下雨啦,现在的小草们:[1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1] 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天下雨啦,现在的小草们:[1, 1, 1, 0, 0, 2, 1, 1, 1, 2, 0, 0, 1, 1, 2, 1, 2, 2, 1, 0, 1, 1, 0, 1, 2, 1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 0, 1, 0, 2, 1, 2, 2, 2, 0, 0, 2, 1, 2, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 0, 1, 1, 2, 2, 2, 0, 2, 1, 2, 1, 2, 1, 0, 1, 0, 2, 1, 1, 1, 2, 1, 1, 1] 今天没有下雨,没有小草生长... 目前为止还没有小草生长完成 一天过去了...小草会不会生长呢? 今天下雨啦,现在的小草们:[2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 1, 1, 2, 2, 2, 3, 2, 1, 1, 1, 0, 1, 2, 2, 1, 2, 2, 2, 0, 1, 3, 1, 2, 0, 1, 0, 3, 2, 3, 3, 3, 0, 1, 2, 1, 2, 0, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 2, 3, 1, 2, 2, 1, 3, 2, 1, 1, 2, 3, 2, 2, 1, 2, 1, 3, 1, 2, 2, 1, 1, 0, 3, 2, 2, 1, 3, 2, 2, 1] 今天没有下雨,没有小草生长... 有小草生长完成了,现在的小草们:[2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 1, 1, 2, 2, 2, 3, 2, 1, 1, 1, 0, 1, 2, 2, 1, 2, 2, 2, 0, 1, 3, 1, 2, 0, 1, 0, 3, 2, 3, 3, 3, 0, 1, 2, 1, 2, 0, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 2, 3, 1, 2, 2, 1, 3, 2, 1, 1, 2, 3, 2, 2, 1, 2, 1, 3, 1, 2, 2, 1, 1, 0, 3, 2, 2, 1, 3, 2, 2, 1] 提醒牛儿该吃草了 草线程解锁 通知牛儿吃草了 一天过去了...小草会不会生长呢? ============================================== 可以看到牛只有一开始调用了一次...之后再也没有被唤醒, 而且前几次小草没有sleep就运行了好多次,之后才开始运行sleep,打印"提醒牛儿该吃草了", "草线程解锁", "通知牛儿吃草了"才开始运行。谷歌和本站都查了一些问题,但和我的情况都不太相似。真心像各位请教...拜托了..
自己封装了一个线程池,求大神帮忙看下有没有安全方面的问题
自己封装的一个jdbc,给jdbc增加了一个连接池,但是不知道有没有问题,所以让大神们帮忙看下,我写的这个线程池有没有问题 ``` package tool; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Properties; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Jdbc { //连接池中的连接 private Connection conn; private ResultSet rs; private ResultSetMetaData md; private PreparedStatement ps; private JSONArray list; private JSONObject map; private String classpath = getClass().getResource("/").getPath(); private String path = classpath + "jdbc.properties"; private BlockingQueue<Connection> connections = new LinkedBlockingQueue<>(); public Jdbc(){} /** * 初始化Jdbc连接池 * @param poolSize 连接池大小 * @throws IOException * @throws ClassNotFoundException * @throws SQLException * @throws InterruptedException */ public void initJdbcPool() throws IOException, ClassNotFoundException, SQLException, InterruptedException { FileInputStream fis = new FileInputStream(path); Properties prop = new Properties(); prop.load(fis); String url = prop.getProperty("db.url"); String user = prop.getProperty("db.user"); String psw = prop.getProperty("db.password"); Integer connectionNum = Integer.parseInt(prop.getProperty("connectionNum")); Class.forName(prop.getProperty("driverClass")); for (int i = 0; i < connectionNum; i++) { //获取数据库的连接 Connection dbConn = DriverManager.getConnection(url, user, psw); //System.out.println(dbConn); connections.put(dbConn); } } public void destroyJdbcPool() { connections.clear(); } /** * 从连接池中获取链接 * @return * @throws InterruptedException */ private Connection getConnection() throws InterruptedException { return connections.take(); } /** * 把连接放回到连接池中,并关闭声明对象和结果集对象 * @param connection 连接 * @param ps 声明对象 * @param rs 结果集对象 * @throws SQLException * @throws InterruptedException */ private void backConnection(Connection connection,PreparedStatement ps,ResultSet rs) throws SQLException, InterruptedException { if(ps!=null) ps.close(); if(rs!=null) rs.close(); connections.put(connection); } /** * 执行dml操作 * @param sql sql语句 * @param objs 参数对象 * @return */ public boolean dml(String sql, Object... objs) { try { conn = getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { ps.setObject(i+1, objs[i]); } int flg = ps.executeUpdate(); if(flg==1) { return true; } } catch (SQLException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }finally { try { backConnection(conn,ps,rs); } catch (SQLException | InterruptedException e) { e.printStackTrace(); } } return false; } /** * 全查 * @param sql * @param objs * @return */ public JSONArray find(String sql,Object...objs){ list = new JSONArray(); try { conn = getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { ps.setObject(i+1, objs[i]); } rs = ps.executeQuery(); md = rs.getMetaData(); while (rs.next()) { map = new JSONObject(); for (int i = 1; i <= md.getColumnCount(); i++) { String key = md.getColumnName(i); Object value = rs.getObject(i); map.put(key, value); } list.add(map); } } catch (SQLException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }finally { try { backConnection(conn,ps,rs); } catch (SQLException | InterruptedException e) { e.printStackTrace(); } } return list; } /** * 单查 * @param sql * @param objs * @return */ public JSONObject findOne(String sql,Object...objs){ JSONArray list = find(sql,objs); if(list!=null) { if(list.size()>0) { return list.getJSONObject(0); } } return null; } /** * 添加 * @param sql * @param objs * @return */ public boolean add(String sql,Object...objs) { return dml(sql, objs); } /** * 修改 * @param sql * @param objs * @return */ public boolean mod(String sql,Object...objs){ return dml(sql, objs); } /** * 删除 * @param sql * @param objs * @return */ public boolean del(String sql,Object...objs){ return dml(sql, objs); } } ``` jdbc.properties ``` db.url=jdbc:mysql://127.0.0.1:3306/juser db.user=root db.password=root driverClass=com.mysql.jdbc.Driver connectionNum=30 ```
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
实战:如何通过python requests库写一个抓取小网站图片的小爬虫
有点爱好的你,偶尔应该会看点图片文字,最近小网站经常崩溃消失,不如想一个办法本地化吧,把小照片珍藏起来! 首先,准备一个珍藏的小网站,然后就可以开始啦! 第一步 我们先写一个获取网站的url的链接,因为url常常是由page或者,其他元素构成,我们就把他分离出来,我找到的网站主页下有图片区 图片区内有标题页,一个标题里有10张照片大概 所以步骤是: 第一步:进入图片区的标题页 def getH...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问