@Autowired
private ThreadPoolTaskExecutor taskExecutor;
final int size = list.size();
final List<PaperDetail> details = new Vector(size);
final CountDownLatch latch = new CountDownLatch(size);
list.stream().forEach(paper -> taskExecutor.execute(() -> {
details.add(getById(paper.getId()));
latch.countDown();
}));
try {
latch.await();
} catch (InterruptedException e) {
Logs.L().error("paper list error: ", e);
throw new HNException("内部异常");
}
List<PaperDetail> details = Lists.newArrayList();
List<Future<PaperDetail>> futures = Lists.newArrayList();
list.forEach(paper -> futures.add(taskExecutor.submit(() -> getById(paper.getId())))); // 匿名有返回值的线程Callable
for (int i = 0; i < futures.size(); i++) {
try {
details.add(futures.get(i).get(10, TimeUnit.SECONDS));
} catch (Exception e) {
Logs.L().error("paper list error: ", e);
}
}
type Master struct {
maxWorkers int
workerPool chan chan Job
}
func NewMaster(maxWorkers int) *Master {
return &Master{
maxWorkers: maxWorkers,
workerPool: make(chan chan Job, maxWorkers),
}
}
func (m *Master) dispatch() {
for i := 1; i < m.maxWorkers+1; i++ {
worker := NewWorker(i, m.workerPool)
worker.Run()
}
go func() {
for {
select {
case job := <-JobQueue:
go func(job Job) {
jobChannel := <-m.workerPool
jobChannel <- job
}(job)
}
}
}()
}
var (
MaxWorkers = 100
JobQueueLen = 100
JobQueue = make(chan Job, JobQueueLen)
)
type Job struct {
Payload Payload
}
type Payload struct {
Name string
}
func (p *Payload) Do(id int) {
fmt.Printf("worker-%v now working, job: %v\n", id, p.Name)
time.Sleep(time.Second * 5)
}
type Worker struct {
Id int
quit chan bool
jobChannel chan Job
workerPool chan chan Job
}
func NewWorker(id int, workerPool chan chan Job) Worker {
return Worker{
Id: id,
quit: make(chan bool),
jobChannel: make(chan Job),
workerPool: workerPool,
}
}
func (w *Worker) Run() {
go func() {
for {
w.workerPool <- w.jobChannel
select {
case job := <-w.jobChannel:
job.Payload.Do(w.Id)
case <-w.quit:
return
}
}
}()
}
func (w *Worker) Stop() {
go func() {
w.quit <- true
}()
}
func main() {
master := NewMaster(MaxWorkers)
master.dispatch()
for i := 1; i <= 100000; i++ {
JobQueue <- Job{Payload: Payload{Name: fmt.Sprintf("Job%v", i)}}
}
time.Sleep(time.Second * 1000)
}
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework-version}</version>
</dependency>
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10"/>
<property name="keepAliveSeconds" value="200"/>
<property name="maxPoolSize" value="50"/>
</bean>
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
List<T> taskList = Lists.newArrayList(); //任务列表
List<T> resultList = Lists.newArrayList(); //执行结果列表
List<Future<T>> futures = Lists.newArrayList(); //异步计算列表
taskList.forEach(task -> futures.add(taskExecutor.submit(() -> {process task...}))); // ()->: 匿名有返回值的线程Callable
for (int i = 0; i < futures.size(); i++) {
try {
resultList.add(futures.get(i).get(10, TimeUnit.SECONDS)); //超时设置
} catch (Exception e) {
log.error("process error: ", e);
}
}
生产环境(centos7,jdk8)中tomcat启动非常缓慢,几分钟才能启动
修改前:securerandom.source=file:/dev/random
修改后:securerandom.source=file:/dev/./urandom
$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom
sessionId及其它随机数的生成, 通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是SHA1PRNG/dev/random, 阻塞的随机数发生器/dev/urandom, 非阻塞的随机数发生器
cat /dev/urandom | head -n 10 | md5sum | head -c 10 #c61adce3e4
cat /dev/urandom | strings -n 8 | head -n 1 #生成全字符的随机字符串,fLqF!lSB)
cat /dev/urandom | sed -e 's/[^a-zA-Z0-9]//g' | strings -n 8 | head -n 1 #生成数字加字母的随机字符串,HRZuXFMb 其中 strings -n设置字符串的字符数,head -n设置输出的行数
// 获取文件大小的接口
type Size interface {
Size() int64
}
// 获取文件信息的接口
type Stat interface {
Stat() (os.FileInfo, error)
}
// 文件大小
var size int64 = 0
if stat, ok := file.(Stat); ok {
fileInfo, err := stat.Stat()
if err != nil {
panic(err)
}
size = fileInfo.Size()
} else if sizer, ok := file.(Size); ok {
size = sizer.Size()
}
github每次push的时候,都要输入用户名密码
git remote -v
git remote rm origin
git remote add origin git@github.com:xxx/xxx.git
git push origin