master
parent
c13c70eed8
commit
0ecb86a2b7
|
@ -0,0 +1,20 @@
|
||||||
|
package com.zxf.web.study.Collection;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ColectionStudy {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
List l= new ArrayList();
|
||||||
|
l.add("123");
|
||||||
|
l.size();
|
||||||
|
System.out.println(l.size());
|
||||||
|
List q= new LinkedList();
|
||||||
|
q.add("123");
|
||||||
|
q.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
public class MyThread extends Thread {
|
||||||
|
public MyThread() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyThread(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//run方法是每个线程运行过程中都必须执行的方法
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
System.out.println(this.getName() + ":" + "-----------" + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.FutureTask;
|
||||||
|
|
||||||
|
public class NumThread implements Callable {
|
||||||
|
|
||||||
|
private int sum=0;//
|
||||||
|
|
||||||
|
//可以抛出异常
|
||||||
|
@Override
|
||||||
|
public Object call() throws Exception {
|
||||||
|
for(int i = 0;i<=100;i++){
|
||||||
|
if(i % 2 == 0){
|
||||||
|
System.out.println(Thread.currentThread().getName()+":"+i);
|
||||||
|
sum += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
public class StudyThreadOne {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//创建线程
|
||||||
|
MyThread t01 = new MyThread();
|
||||||
|
MyThread t02 = new MyThread();
|
||||||
|
MyThread t03 = new MyThread("线程03");
|
||||||
|
|
||||||
|
//开启线程
|
||||||
|
// t01.run();
|
||||||
|
// t02.run();
|
||||||
|
// t03.run();
|
||||||
|
// 不会启动线程,不会分配新的分支栈。(这种方式就是单线程。)
|
||||||
|
// start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了。
|
||||||
|
// 这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来,start()方法就结束了。线程就启动成功了。
|
||||||
|
// 启动成功的线程会自动调用run方法,并且run方法在分支栈的栈底部(压栈)。
|
||||||
|
// run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级的。
|
||||||
|
t01.start();
|
||||||
|
t02.start();
|
||||||
|
t03.start();
|
||||||
|
//设置线程名(补救的设置线程名的方式)
|
||||||
|
t01.setName("线程01");
|
||||||
|
t02.setName("线程02");
|
||||||
|
//设置主线程名称
|
||||||
|
Thread.currentThread().setName("主线程");
|
||||||
|
|
||||||
|
System.out.println(Thread.currentThread().getName() + ":" );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
public class StudyThreadTwo {
|
||||||
|
public static void main(String[] args){
|
||||||
|
window1 w = new window1();
|
||||||
|
|
||||||
|
//虽然有三个线程,但是只有一个窗口类实现的Runnable方法,由于三个线程共用一个window对象,所以自动共用100张票
|
||||||
|
|
||||||
|
Thread t1=new Thread(w);
|
||||||
|
Thread t2=new Thread(w);
|
||||||
|
Thread t3=new Thread(w);
|
||||||
|
|
||||||
|
t1.setName("窗口1");
|
||||||
|
t2.setName("窗口2");
|
||||||
|
t3.setName("窗口3");
|
||||||
|
|
||||||
|
t1.start();
|
||||||
|
t2.start();
|
||||||
|
t3.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class window1 implements Runnable{
|
||||||
|
|
||||||
|
private int ticket = 100;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while(true){
|
||||||
|
if(ticket>0){
|
||||||
|
// try {
|
||||||
|
// sleep(100);
|
||||||
|
// } catch (InterruptedException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
System.out.println(Thread.currentThread().getName()+"当前售出第"+ticket+"张票");
|
||||||
|
ticket--;
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
public class ThreadModulStudy {
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.FutureTask;
|
||||||
|
|
||||||
|
public class ThreadNew {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//new一个实现callable接口的对象
|
||||||
|
NumThread numThread = new NumThread();
|
||||||
|
|
||||||
|
//通过futureTask对象的get方法来接收futureTask的值
|
||||||
|
FutureTask futureTask = new FutureTask(numThread);
|
||||||
|
|
||||||
|
Thread t1 = new Thread(futureTask);
|
||||||
|
Thread t2 = new Thread(futureTask);
|
||||||
|
t1.setName("线程1");
|
||||||
|
t1.start();
|
||||||
|
|
||||||
|
t2.setName("线程2");
|
||||||
|
t2.start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
//get返回值即为FutureTask构造器参数callable实现类重写的call的返回值
|
||||||
|
Object sum = futureTask.get();
|
||||||
|
System.out.println(Thread.currentThread().getName() + ":" + sum);
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.zxf.web.study.Thread;
|
||||||
|
|
||||||
|
public class demo7 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Thread t = new Thread(()->{
|
||||||
|
while (true) {
|
||||||
|
System.out.println("thread--");
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},"一个简简单单的线程");
|
||||||
|
|
||||||
|
t.start();//启动线程
|
||||||
|
System.out.println(t.getId());
|
||||||
|
System.out.println(t.getState());
|
||||||
|
System.out.println(t.getPriority());
|
||||||
|
System.out.println(t.isDaemon());
|
||||||
|
System.out.println(t.isAlive());
|
||||||
|
System.out.println(t.isInterrupted());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.zxf.web.study.Thread.pool;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class Executors {
|
||||||
|
|
||||||
|
/* Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService接口。常用方法有以下几个:
|
||||||
|
|
||||||
|
newFiexedThreadPool(int Threads):创建固定数目线程的线程池。
|
||||||
|
|
||||||
|
newCachedThreadPool():创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
|
||||||
|
|
||||||
|
newSingleThreadExecutor()创建一个单线程化的Executor。
|
||||||
|
|
||||||
|
newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
|
||||||
|
|
||||||
|
类看起来功能还是比较强大的,又用到了工厂模式、又有比较强的扩展性,重要的是用起来还比较方便,如:
|
||||||
|
|
||||||
|
ExecutorService executor = Executors.newFixedThreadPool(nThreads) ;
|
||||||
|
|
||||||
|
即可创建一个固定大小的线程池。
|
||||||
|
|
||||||
|
使用 Executors 创建四种类型的线程池
|
||||||
|
|
||||||
|
newCachedThreadPool是Executors工厂类的一个静态函数,用来创建一个可以无限扩大的线程池。
|
||||||
|
|
||||||
|
而Executors工厂类一共可以创建四种类型的线程池,通过Executors.newXXX即可创建。下面就分别都介绍一下。
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// 1. FixedThreadPool
|
||||||
|
public static ExecutorService newFixedThreadPool(int nThreads){
|
||||||
|
return new ThreadPoolExecutor(nThreads,nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.zxf.web.study.Thread.pool;
|
||||||
|
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
|
import com.zxf.web.study.Thread.MyThread;
|
||||||
|
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
|
public class ExecutorsDemo {
|
||||||
|
|
||||||
|
private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
|
||||||
|
.setNameFormat("demo-pool-%d").build();
|
||||||
|
|
||||||
|
private static ExecutorService pool = new ThreadPoolExecutor(5, 200,
|
||||||
|
0L, TimeUnit.MILLISECONDS,
|
||||||
|
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
for (int i = 0; i < Integer.MAX_VALUE; i++) {
|
||||||
|
pool.execute(new MyThread());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue