1.创建线程
(1)第一种方式就是直接继承Thread这个类,这个类其实是实现了Runnable这个接口,只不过没有显示的声明出来,
不过你要是直接继承这个类,你需要去自己写一个run的方法,这个方法里写你的多线程逻辑。
public class CreateThreadbyExtendsTh { public static void main(String[] args){ System.out.println("main Thread......"); Thread t1 = new Thread1("TTT1"); Thread t2 = new Thread2("TTT2"); t1.start();t2.start(); } } class Thread1 extends Thread { Thread1 (String str) { super(str); } public void run() { for (int i = 1; i <= 10; i++) { System.out.println(this.getName()+" "+i+"\t"); } } } class Thread2 extends Thread { Thread2 (String str) { super(str); } public void run() { for (int i = -100; i <=-90 ; i++) { System.out.println(this.getName()+"aaa"+i+"\t"); } } }
(2)第二种方式就是你的类实现Runnable这个接口,如果你去实现了这个接口,那么意味着这个接口里的方法你也要去实现了
就是run的方法,这个run方法里你可以去写你的多线程逻辑,最后只需要把你这个实现了Runnnable这个接口的类的对象传到
Thread这个构造方法里就可以了。
public class CreateThreadbyRunnable { public static void main(String[] args){ System.out.println("main thread......"); MyTask myTask = new MyTask(10); Thread thread = new Thread(myTask); thread.start(); for (char ch = 'a'; ch <= 'k'; ch++) { System.out.print(" "+ch+" "); } } } class MyTask implements Runnable { private int n; public MyTask(int n){ this.n = n; } @Override public void run() { for (int i = 0; i < n; i++) { System.out.print(" "+i); } } }
2.值得注意的是我们还要关注sleep这个方法,这个方法是使线程休眠的方法,从而执行多个线程:
import java.text.SimpleDateFormat; import java.util.Date; public class TestThread3 { public static void main(String[] args) { Runner r1 = new Runner("Parameter1"); Thread t1 = new Thread(r1); Thread t2 = new Thread(r1); Thread t3 = new Thread(r1); Runner r2 = new Runner("Parameter2"); Thread t4 = new Thread(r2); Thread t5 = new Thread(r2); Thread t6 = new Thread(r2); Timer timer = new Timer(); Thread t7 = new Thread(timer); t1.setName("t1"); t2.setName("t2");t3.setName("t3");t4.setName("t4"); t5.setName("t5");t6.setName("t6");t7.setName("t7"); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); t7.start(); } } class Runner implements Runnable { String para; Runner(String para){ this.para = para; } @Override public void run() { int i = 0; while (i < 20){ i++; System.out.print("para: "+para+" "); System.out.println(Thread.currentThread().getName()+"No."+i); try { Thread.sleep(100);//使线程休眠,使其它线程有得到CPU的机会 } catch (InterruptedException e){} } } } class Timer implements Runnable { @Override public void run() { for (int i = 1; i <3 ; i++) { System.out.print(Thread.currentThread().getName()); System.out.println(" "+new SimpleDateFormat("yyyy-MM-dd").format( new Date( ))); try { Thread.sleep(300); } catch (InterruptedException e) {} } } }
3.还有一个关键字wait()是使线程暂停的,而notify()是使线程恢复的,synchronized这个关键字是使线程同步的,设置了这个关键字意味着多个线程不同时访问临界资源,只能被一个线程独立的占用,其它线程阻塞。
public class Basket { int index = 0; Apple[] apples = new Apple[5]; public synchronized void push(Apple apple) { while (index == apples.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); apples[index] = apple; index ++; } public synchronized Apple pop() { while (index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); index--; return apples[index]; } }
4.还有一个关键方法就是join()这个方法是使正在运行的线程暂停下来:
public class TestJoin { public static void main(String[] args) { MyThread2 t1 = new MyThread2("MyThread"); t1.start(); try { t1.join(); } catch (InterruptedException e) {} for (int i = 1; i <=5 ; i++) { System.out.println("i am main thread"); try { Thread.sleep(200); } catch (InterruptedException e){} } } } class MyThread2 extends Thread { MyThread2(String s) { super(s); } @Override public void run() { for (int i = 1; i <= 5 ; i++) { System.out.println("i am "+getName()); try { sleep(200); } catch (InterruptedException e) { } } } }
5.这个yield()方法是为了切换线程的切换后按优先级执行
6.综合就是生产者---消费者模式:
public class Apple { int id;//用id标识一个苹果 Apple(int id) { this.id = id; } public String toString() { return "apple : "+id; } }
public class Basket { int index = 0; Apple[] apples = new Apple[5]; public synchronized void push(Apple apple) { while (index == apples.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); apples[index] = apple; index ++; } public synchronized Apple pop() { while (index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); index--; return apples[index]; } }
public class Consumer implements Runnable { Basket basket = null; Consumer(Basket basket) { this.basket = basket; } @Override public void run() { for (int i = 0; i <5 ; i++) { Apple apple = basket.pop(); System.out.println(Thread.currentThread().getName()+"消费了:" + apple); try { Thread.sleep((int)(Math.random() * 300)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public class Producer implements Runnable { Basket basket = null; Producer(Basket basket) { this.basket = basket; } @Override public void run() { for (int i = 0; i < 10; i++) { Apple apple = new Apple(i); System.out.println(Thread.currentThread().getName()+"生产了:" + apple); basket.push(apple); try { Thread.sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public class ProducerAndConsumer { public static void main(String[] args) { Basket basket = new Basket(); Producer p = new Producer(basket); Consumer c = new Consumer(basket); Thread t1 = new Thread(p); t1.setName("生产者1 "); t1.start(); Thread t2 = new Thread(c); t2.setName("消费者1 "); Thread t3 = new Thread(c); t3.setName("消费者2 "); t3.start(); } }