스레드는 대상의 조작에 대해 이해하지 못한다
2634 단어 thread
package com.yuan;
import java.io.Serializable;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
private static int produceTaskSleepTime = 3000;
private static int consumeTaskSleepTime = 2000;
private static int produceTaskMaxNumber = 1;
public static void main(String[] args) {
//
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,4, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
for (int i = 1; i <= produceTaskMaxNumber; i++) {
try {
// ,
String task = "task@ " + i;
User u = new User();
u.setId(1);
u.setName("yqf");
System.out.println("put " + task);
ThreadPoolTask t = new ThreadPoolTask(u);
threadPool.execute(t);
// ,
Thread.sleep(produceTaskSleepTime);
System.out.println("MAIN TASK:"+ u.getName());
System.out.println(" t user: " + t.getUser().getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
* @author hdpan
*/
public static class ThreadPoolTask implements Runnable, Serializable {
private static final long serialVersionUID = 0;
//
private User threadPoolTaskData;
ThreadPoolTask(User tasks) {
this.threadPoolTaskData = tasks;
}
public void run() {
// , ,
System.out.println("start .." + threadPoolTaskData);
/*try {
// // ,
Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}*/
System.out.println("ThreadPoolTask task:" + threadPoolTaskData);
threadPoolTaskData = null;
//threadPoolTaskData.setName("3333");
}
public User getUser(){
return threadPoolTaskData;
}
}
}
위 코드는 주 루틴이 하나의 User 대상을 구성하여user 대상을 루틴으로 전송하고 루틴 안에서user를 =null 조작했습니다.그리고 메인 라인으로 돌아가서 시스템을 찾으러 가는 것을 발견했다.out.println("MAIN TASK:"+ u.getName());를 찾을 수 있지만 System을 호출합니다.out.println("t user: "+ t.getUser().getName());확실히 포인터가 비어 있습니다.
그리고 만약 하위 라인에서user에 대해 이름 수정 작업을 했다면, 시스템.out.println("MAIN TASK:"+ u.getName());하위 루틴 조작 후의user를 찾을 수 있습니다.
왜 이러는지 모르겠어??
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception in thread main java.lang. NoClassDefFoundError 오류 해결 방법즉,/home/hadoop/jarfile) 시스템은 Hello World 패키지 아래의class라는 클래스 파일을 실행하고 있다고 오인하여 시스템의 CLASSPATH 아래 (일반적으로 현재 디렉터리를 포함) Hell...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.