线程的创建
package JUC.juc1;
public class CreateThread {
public static void main(String[] args) {
ThreadDemo1 threadDemo1 = new ThreadDemo1();
threadDemo1.setName("Thread Method");
threadDemo1.start();
Thread runnable = new Thread(new ThreadDemo2(), "Runnable interface");
runnable.start();
runnable.run();
new Thread(
() ->
System.out.println(Thread.currentThread() + "run3()方法执行"), "run3")
.start();
}
}
class ThreadDemo1 extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread() + "run1()方法执行");
}
}
class ThreadDemo2 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread() + "run2()方法执行");
}
}
死锁
package JUC.juc1;
public class DeadLockDemo {
private static Object resource1 = new Object();
private static Object resource2 = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (resource1){
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2){
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "线程1").start();
Thread thread = new Thread(new Thread2(), "线程2");
thread.start();
}
static class Thread2 implements Runnable{
@Override
public void run() {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
}
}
}
}
}
三个线程轮流打印ABC
package JUC.juc1;
public class PrintABC {
private int num;
private static final Object Lock = new Object();
public static void main(String[] args) {
PrintABC printABC = new PrintABC();
for (int i =0; i < 50; i++){
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
printABC.printMehthod("A", 0);
}
});
thread1.setName("A");
thread1.start();
new Thread(new Runnable() {
@Override
public void run() {
printABC.printMehthod("B", 1);
}
}, "B").start();
new Thread(() -> printABC.printMehthod("C", 2), "C").start();
}
Lock.notifyAll();
}
private void printMehthod(String name, int targetNum){
synchronized (Lock)
{
while (num % 3 != targetNum) {
try {
Lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num++;
System.out.println(name);
Lock.notifyAll();
}
}
}
两个线程轮流打印奇偶数
package JUC.juc1;
public class PrintOddEven {
private volatile int count;
private Object monitor = new Object();
PrintOddEven(int initCount){
this.count = initCount;
}
public static void main(String[] args) {
PrintOddEven printOddEven = new PrintOddEven(0);
new Thread(() -> printOddEven.printMethod(), "odd ").start();
new Thread(() -> printOddEven.printMethod(), "even").start();
}
private void printMethod() {
synchronized (monitor)
{
while (count < 100) {
try {
System.out.print(Thread.currentThread().getName() + ":");
System.out.println(++count);
monitor.notifyAll();
monitor.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
monitor.notifyAll();
}
}
}
N个线程轮流连续打印1到100.
package JUC.juc1;
public class PrintOneByOneTo100 {
private volatile int num = 0;
private static int N = 4;
private int maxnum = 100;
private Object monitor = new Object();
public static void main(String[] args) {
PrintOneByOneTo100 printOneByOneTo100 = new PrintOneByOneTo100();
for (int i = 0; i < N; i++){
int finalI = i;
new Thread(() -> printOneByOneTo100.printMethod(finalI), "Thread" + i).start();
}
}
private void printMethod(int targetNum) {
while (true) {
synchronized (monitor) {
while (num % N != targetNum) {
if (num >= maxnum){
break;
}
try {
monitor.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (num >= maxnum) {
break;
}
num++;
System.out.println(Thread.currentThread() + ":" + num);
monitor.notifyAll();
}
}
}
}