==========================================【1】===============================================
package com.xixue.entity;
/**
* 用户实例
* @author houdo
*
*/
public class UserEntity {
/**
* 用户id
*/
private String userId;
/**
* 用户名称
*/
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public UserEntity(String userId, String userName) {
super();
this.userId = userId;
this.userName = userName;
}
@Override
public String toString() {
return "UserEntity [userId=" + userId + ", userName=" + userName + "]";
}
}
==========================================【2】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 常用线程API
* @author houdo
*
*/
public class ThreadDemoAPI {
private static Logger logger = Logger.getLogger(ThreadDemoAPI.class);
public static void main(String[] args) {
DemoThread demoThread = new DemoThread();
demoThread.start();
}
}
class DemoThread extends Thread{
private static Logger logger = Logger.getLogger(DemoThread.class);
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(getName()+"--------"+currentThread().getId());
}
}
}
==========================================【3】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 线程之间通信
*
* @author houdo
*
*/
public class ThreadDemoCommunication {
Logger logger = Logger.getLogger(ThreadDemoCommunication.class);
public static void main(String[] args) {
Resource resource = new Resource();
TreadProduce produce = new TreadProduce(resource);
ThreadConsumer consumer = new ThreadConsumer(resource);
produce.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
consumer.start();
}
}
/**
* 操作对象
*
* @author houdo
*
*/
class Resource {
private String name;
private String sex;
//线程通讯标识
public boolean flag = false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Resource [name=" + name + ", sex=" + sex + "]";
}
}
/**
* 生产者
*
* @author houdo
*
*/
class TreadProduce extends Thread {
Logger logger = Logger.getLogger(TreadProduce.class);
Resource resource;
public TreadProduce(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
int num = 0;
while (true) {
synchronized (resource) {
if (resource.flag) {
try {
// 当前线程变为等待,但是可以释放锁
resource.wait();
} catch (Exception e) {
}
}
if (num == 0) {
resource.setName("小红");
resource.setSex("女");
} else {
resource.setName("小明");
resource.setSex("男");
}
num = (num + 1) % 2;
resource.flag = true;
// 唤醒当前线程
resource.notify();
}
}
}
}
/**
* 消费者
*
* @author houdo
*
*/
class ThreadConsumer extends Thread{
Logger logger = Logger.getLogger(ThreadConsumer.class);
Resource resource;
public ThreadConsumer(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
synchronized (resource) {
if (!resource.flag) {
try {
resource.wait();
} catch (Exception e) {
}
}
logger.info(resource.toString());
resource.flag = false;
resource.notify();
}
}
}
}
==========================================【4】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 线程死锁
* @author houdo
*
*/
public class ThreadDemoDead {
public static void main(String[] args) throws InterruptedException {
DeadThread threadTrain = new DeadThread();
Thread thread = new Thread(threadTrain, "t1");
Thread thread2 = new Thread(threadTrain, "t2");
thread.start();
Thread.sleep(10000);
threadTrain.flag = false;
thread2.start();
}
}
class DeadThread implements Runnable {
Logger logger = Logger.getLogger(DeadThread.class);
private int count = 100;
Object obj1 = new Object();
Object obj2 = new Object();
public boolean flag = true;
@Override
public void run() {
if (flag) {
while (count > 0) {
synchronized (obj1) {
show();
}
}
} else {
while (count > 0) {
synchronized (obj2) {
show2();
}
}
}
}
public void show2() {
synchronized (obj1) {
logger.info("------------------");
if (count > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(Thread.currentThread().getName() + "[" + (100 - count + 1) + "]");
count--;
}
}
}
public void show() {
synchronized (obj2) {
if (count > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(Thread.currentThread().getName() + "[" + (100 - count + 1) + "]");
count--;
}
}
}
}
==========================================【5】===============================================
package com.xixue.process;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
/**
* 并发包 newCachedThreadPool newFixedThreadPool newScheduleThreadPool
* newSingleThreadExecutors
*
* @author houdo
*
*/
public class ThreadDemoExecutors {
@Test
private void test01() {
ExecutorService pool = Executors.newCachedThreadPool(); //具有缓存线程
for (int i = 0; i < 10; i++) {
int index = i;
pool.execute(new Runnable() {
@Override
public void run() {
try {
/*Thread.sleep(400);*/
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread() + "----" + index);
/*if (index == 9) {
newCachedThreadPool.shutdown();
}*/
}
});
}
}
@Test
private void test02() {
ExecutorService pool = Executors.newFixedThreadPool(2); //每次执行固定的线程个数
for (int i = 0; i < 10; i++) {
int index = i;
pool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(400);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread() + "----" + index);
/*if (index == 9) {
newCachedThreadPool.shutdown();
}*/
}
});
}
}
@Test
private void test03() {
ScheduledExecutorService pool = Executors.newScheduledThreadPool(5); //定时的线程池
pool.schedule(new Runnable() {
public void run() {
System.out.println("三秒之后执行");
}}, 3, TimeUnit.SECONDS);
}
public static void main(String[] args) {
// ExecutorService pool = Executors.newCachedThreadPool(); //具有缓存线程
// ExecutorService pool = Executors.newFixedThreadPool(2); //每次执行固定的线程个数
// ScheduledExecutorService pool = Executors.newScheduledThreadPool(5); //定时的线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); //单线程池
for (int i = 0; i < 10; i++) {
int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(400);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread() + "----" + index);
/*if (index == 9) {
newCachedThreadPool.shutdown();
}*/
}
});
}
}
}
==========================================【6】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* java内存模型 JMM 共享全局变量 + 线程本地变量
* @author houdo
*
*/
public class ThreadDemoJMM {
static Logger logger = Logger.getLogger(ThreadDemoJMM.class);
public static void main(String[] args) throws InterruptedException {
DemoJMM demoJMM = new DemoJMM();
demoJMM.start();
Thread.sleep(100);
demoJMM.getRun(false);
}
}
class DemoJMM extends Thread{
public volatile boolean flag = true;
@Override
public void run() {
System.out.println("子线程开始执行");
while (flag) {
}
System.out.println("子线程结束");
}
public void getRun(boolean flag){
this.flag = flag;
}
}
==========================================【7】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 线程join方法
* @author houdo
*
*/
public class ThreadDemoJoin {
static Logger logger = Logger.getLogger(ThreadDemoJoin.class);
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i =0 ; i < 100 ; i++) {
logger.info(Thread.currentThread().getName()+"--"+i);
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i =0 ; i < 100 ; i++) {
logger.info(Thread.currentThread().getName()+"--"+i);
}
}
},"t2");
t1.start();
t1.join();
t2.start();
for(int i =0 ; i < 100 ; i++) {
logger.info(Thread.currentThread().getName()+"--"+i);
}
}
}
==========================================【8】===============================================
package com.xixue.process;
import com.xixue.BaseFunction;
/**
* 匿名内部类
* @author houdo
*
*/
public class ThreadDemoNON {
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(ThreadDemoNON.class);
public static void main(String[] args) {
logger.info("创建线程开始");
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 200; i++) {
if (i==199) {
System.out.println(10/0);
}
logger.info("run"+i);
}
}
}).start();
logger.info("创建线程结束");
for (int i = 0; i < 200; i++) {
logger.info("run"+i);
}
}
}
==========================================【9】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 实现Runable接口
* @author houdo
*
*/
public class ThreadDemoRunable {
private static Logger logger = Logger.getLogger(ThreadDemoRunable.class);
public static void main(String[] args) {
logger.info("创建线程开始");
CreateRunable createRunable = new CreateRunable();
Thread thread = new Thread(createRunable);
thread.start();
logger.info("创建线程结束");
for (int i = 0; i < 200; i++) {
logger.info("run"+i);
}
}
}
class CreateRunable implements Runnable{
private Logger logger = Logger.getLogger(CreateRunable.class);
@Override
public void run() {
for (int i = 0; i < 200; i++) {
if (i==199) {
System.out.println(10/0);
}
logger.info("run"+i);
}
}
}
==========================================【10】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 线程同步
* @author houdo
*
*/
public class ThreadDemoSync {
public static void main(String[] args) {
ProveSynchronizedByThis threadTrain = new ProveSynchronizedByThis();
Thread thread = new Thread(threadTrain, "t1");
Thread thread2 = new Thread(threadTrain, "t2");
thread.start();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
threadTrain.flag = false;
thread2.start();
}
}
/**
* 证明同步方法相当于同步代码块this
*
* @author houdo
*
*/
class ProveSynchronizedByThis implements Runnable {
Logger logger = Logger.getLogger(ProveSynchronizedByThis.class);
private int count = 100;
private Object obj = new Object();
public boolean flag = true;
public synchronized void show() {
if (count > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(Thread.currentThread().getName() + "[" + (100 - count + 1) + "]");
count--;
}
}
@Override
public void run() {
if (flag) {
while (count > 0) {
synchronized (this) {
if (count > 0) {
try {
Thread.sleep(40);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(Thread.currentThread().getName() + "[" + (100 - count + 1) + "]");
count--;
}
}
}
} else {
while (count > 0) {
show();
}
}
}
}
/**
* 同步代码块synchronized
*
* @author houdo
*
*/
class ThreadTrain implements Runnable {
Logger logger = Logger.getLogger(ThreadTrain.class);
private int count = 100;
private Object obj = new Object();
@Override
public void run() {
while (count > 0) {
synchronized (obj) {
if (count > 0) {
try {
Thread.sleep(40);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(Thread.currentThread().getName() + "[" + (100 - count + 1) + "]");
count--;
}
}
}
}
}
/**
* 同步方法synchronized
*
* @author houdo
*
*/
class ThreadTrain2 implements Runnable {
Logger logger = Logger.getLogger(ThreadTrain2.class);
private int count = 100;
private Object obj = new Object();
@Override
public void run() {
while (count > 0) {
show();
}
}
public synchronized void show() {
if (count > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
logger.error(e);
}
logger.info(Thread.currentThread().getName() + "[" + (100 - count + 1) + "]");
count--;
}
}
}
==========================================【11】===============================================
package com.xixue.process;
/**
* ThreadLocal
*
* @author houdo
*
*/
public class ThreadDemoThreadLocal {
public static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
@Override
protected java.lang.Integer initialValue() {
// TODO Auto-generated method stub
return 0;
}
};
public static void main(String[] args) {
Thread[] threads = new Thread[5];
for (Thread thread : threads) {
thread =new Thread(new Runnable() {
@Override
public void run() {
Integer integer = threadLocal.get();
integer +=5;
System.out.println(Thread.currentThread().getName() + "---" + integer);
}
});
thread.start();
}
}
}
class DemoThreadLocal {
}
==========================================【12】===============================================
package com.xixue.process;
import org.apache.log4j.Logger;
/**
* 继承Thread
* @author houdo
* 创建线程
*/
public class ThreadDemoThreads {
private static Logger logger = Logger.getLogger(ThreadDemoThreads.class);
private static String flag="";
public static void main(String[] args) {
logger.info("开始创建线程");
CreateThread createThread = new CreateThread();
createThread.setName("slave");
createThread.start();
// createThread.run();
logger.info("线程已经开始执行");
for (int i = 0; i < 200; i++) {
logger.info("main"+i);
}
}
}
class CreateThread extends Thread{
private Logger logger = Logger.getLogger(CreateThread.class);
@Override
public void run() {
for (int i = 0; i < 200; i++) {
if (i==199) {
System.out.println(10/0);
}
logger.info("run"+i);
}
}
}
==========================================【13】===============================================
package com.xixue.sendSMS;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import com.xixue.entity.UserEntity;
import com.xixue.process.ThreadDemoRunable;
class UserThread extends Thread{
private static Logger logger = Logger.getLogger(UserThread.class);
private List<UserEntity> listUser;
public UserThread(List<UserEntity> list) {
this.listUser = list;
}
@Override
public void run() {
for (UserEntity userEntity : listUser) {
logger.info("["+getName()+"]"+userEntity.toString());
}
}
}
/**
* 批量发送短信
* @author houdo
*
*/
public class BantchSendSMS {
private static Logger logger = Logger.getLogger(BantchSendSMS.class);
public static void main(String[] args) {
//初始化用户
List<UserEntity> setUserList = setUserList(10000000);
//计算线程数
List<List<UserEntity>> splitList = splitList(setUserList, 10000);
//开始进行异步处理数据
for (List<UserEntity> list : splitList) {
UserThread thread = new UserThread(list);
thread.start();
}
}
/**
* 创建用户
* @return
*/
public static List<UserEntity> setUserList(int num) {
List<UserEntity> listUser = new ArrayList<>();
for (int i = 0; i < num; i++) {
listUser.add(new UserEntity("userId:"+i,"userName:"+i));
}
return listUser;
}
/**
* 功能描述:(list 集合分批切割)
* @param list
* @param pageSize 分页长度
* @return
*/
static public <T> List<List<T>> splitList(List<T> list, int pageSize) {
int listSize = list.size();
int page = (listSize + (pageSize - 1)) / pageSize; //页数
List<List<T>> listArray = new ArrayList<List<T>>();
for (int i = 0; i < page; i++) {
List<T> subList = new ArrayList<T>();
for (int j = 0; j < listSize; j++) {
int pageIndex = ((j + 1) + (pageSize - 1)) / pageSize;
if (pageIndex == (i + 1)) {
subList.add(list.get(j));
}
if ((j + 1) == ((j + 1) * pageSize)) {
break;
}
}
listArray.add(subList);
}
logger.info("切割完成");
return listArray;
}