目录
一、排序
具体内容就不记录了。
二、多线程简介
三、Thread
创建线程的方法:
1. extends Thread,重载 run()方法
2. impliments Runnable(),实现run()方法
public static void testThread() {
for (int i = 0; i < 10; ++i) {
//new MyThread(i).start();
}
for (int i = 0; i < 10; ++i) {
final int tid = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; i < 10; ++i) {
Thread.sleep(1000);
System.out.println(String.format("T2%d:%d", tid, i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
class MyThread extends Thread {
private int tid;
public MyThread(int tid) {
this.tid = tid;
}
@Override
public void run() {
try {
for (int i = 0; i < 10; ++i) {
Thread.sleep(1000);
System.out.println(String.format("T%d:%d", tid, i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、Synchronized-内置锁
public static void testSynchronized1() {
synchronized (obj) {
try {
for (int i = 0; i < 10; ++i) {
Thread.sleep(1000);
System.out.println(String.format("T3%d", i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void testSynchronized2() {
synchronized (obj) {
try {
for (int i = 0; i < 10; ++i) {
Thread.sleep(1000);
System.out.println(String.format("T4%d", i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void testSynchronized() {
for (int i = 0; i < 10; ++i) {
new Thread(new Runnable() {
@Override
public void run() {
testSynchronized1();
testSynchronized2();
}
}).start();
}
}
上面的结果是:T3跑完了才能跑T4,然后接着T3....
如果把testSynchronized2中的代码改成new Object(),则会出现T3和T4交叉的情况,因为锁住的是两个不同的对象。
public static void testSynchronized1() {
synchronized (obj) {
try {
for (int i = 0; i < 10; ++i) {
Thread.sleep(1000);
System.out.println(String.format("T3%d", i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void testSynchronized2() {
synchronized (new Object()) {
try {
for (int i = 0; i < 10; ++i) {
Thread.sleep(1000);
System.out.println(String.format("T4%d", i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
五、BlockingQueue 同步队列
class Producer implements Runnable {
private BlockingQueue<String> q;
public Producer(BlockingQueue<String> q) {
this.q = q;
}
@Override
public void run() {
try {
for (int i = 0; i < 100; ++i) {
Thread.sleep(10);
q.put(String.valueOf(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable {
private BlockingQueue<String> q;
public Consumer(BlockingQueue<String> q) {
this.q = q;
}
@Override
public void run() {
try {
while (true) {
System.out.println(Thread.currentThread().getName() + ":" + q.take());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void testBlockingQueue() {
BlockingQueue<String> q = new ArrayBlockingQueue<String>(10);
new Thread(new Producer(q)).start();
new Thread(new Consumer(q), "Consumer1").start();
new Thread(new Consumer(q), "Consumer2").start();
}
六、AutomicInteger
counter++是一个非线程安全的操作。
private static int counter = 0;
private static AtomicInteger atomicInteger = new AtomicInteger(0);
public static void sleep(int mills) {
try {
//Thread.sleep(new Random().nextInt(mills));
Thread.sleep(mills);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testWithAtomic() {
for (int i = 0; i < 10; ++i) {
new Thread(new Runnable() {
@Override
public void run() {
sleep(1000);
for (int j = 0; j < 10; ++j) {
System.out.println(atomicInteger.incrementAndGet());
}
}
}).start();
}
}
public static void testWithoutAtomic() {
for (int i = 0; i < 10; ++i) {
new Thread(new Runnable() {
@Override
public void run() {
sleep(1000);
for (int j = 0; j < 10; ++j) {
counter++;
System.out.println(counter);
}
}
}).start();
}
}
七、ThreadLocal
ThreadLocal 的变量,每一条线程都可以保存自己的一个副本。
private static ThreadLocal<Integer> threadLocalUserIds = new ThreadLocal<>();
private static int userId;
public static void testThreadLocal() {
for (int i = 0; i < 10; ++i) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
threadLocalUserIds.set(finalI);
sleep(1000);
System.out.println("ThreadLocal: " + threadLocalUserIds.get());
}
}).start();
}
for (int i = 0; i < 10; ++i) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
userId = finalI;
sleep(1000);
System.out.println("NonThreadLocal: " + userId);
}
}).start();
}
}
八、Executor
public static void testExecutor() {
//ExecutorService service = Executors.newSingleThreadExecutor();
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
sleep(1000);
System.out.println("Execute1 " + i);
}
}
});
service.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
sleep(1000);
System.out.println("Execute2 " + i);
}
}
});
service.shutdown();
while (!service.isTerminated()) {
sleep(1000);
System.out.println("Wait for termination.");
}
}
九、Future
public static void testFutrue() {
ExecutorService service = Executors.newSingleThreadExecutor();
Future<Integer> future = service.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
sleep(1000);
return 1;
//throw new IllegalArgumentException("异常");
}
});
service.shutdown();
try {
//System.out.println(future.get());
//100毫秒没结束就返回错误
System.out.println(future.get(100, TimeUnit.MILLISECONDS));
} catch (Exception e) {
e.printStackTrace();
}
}