diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Collection/ColectionStudy.java b/zxf-admin/src/main/java/com/zxf/web/study/Collection/ColectionStudy.java new file mode 100644 index 0000000..761f7ea --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Collection/ColectionStudy.java @@ -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(); + } + + +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/MyThread.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/MyThread.java new file mode 100644 index 0000000..d01cb2b --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/MyThread.java @@ -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); + } + } + +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/NumThread.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/NumThread.java new file mode 100644 index 0000000..eeabbbe --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/NumThread.java @@ -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; + } +} + diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/StudyThreadOne.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/StudyThreadOne.java new file mode 100644 index 0000000..b2853ea --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/StudyThreadOne.java @@ -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() + ":" ); + + } +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/StudyThreadTwo.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/StudyThreadTwo.java new file mode 100644 index 0000000..74c8b6d --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/StudyThreadTwo.java @@ -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; + } + } + } + +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/ThreadModulStudy.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/ThreadModulStudy.java new file mode 100644 index 0000000..bcf4863 --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/ThreadModulStudy.java @@ -0,0 +1,4 @@ +package com.zxf.web.study.Thread; + +public class ThreadModulStudy { +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/ThreadNew.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/ThreadNew.java new file mode 100644 index 0000000..170d0d5 --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/ThreadNew.java @@ -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(); + } + } +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/demo7.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/demo7.java new file mode 100644 index 0000000..2f9030d --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/demo7.java @@ -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()); + + } +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/pool/Executors.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/pool/Executors.java new file mode 100644 index 0000000..31b5438 --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/pool/Executors.java @@ -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()); + } + +} diff --git a/zxf-admin/src/main/java/com/zxf/web/study/Thread/pool/ExecutorsDemo.java b/zxf-admin/src/main/java/com/zxf/web/study/Thread/pool/ExecutorsDemo.java new file mode 100644 index 0000000..32f5229 --- /dev/null +++ b/zxf-admin/src/main/java/com/zxf/web/study/Thread/pool/ExecutorsDemo.java @@ -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(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); + + public static void main(String[] args) { + + for (int i = 0; i < Integer.MAX_VALUE; i++) { + pool.execute(new MyThread()); + } + } + + +} +