@一贤爱吃土豆
eg:/** * 线程子类 * @author sx * @version 1.0 2020年10月28日 */ public class MyThread extends Thread{ /** * 重写父类中任务方法 */ @Override public void run() { for (int i = 1; i <= 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } } public static void main(String[] args) { //创建子线程对象 MyThread t1=new MyThread(); MyThread t2=new MyThread(); //启动线程 t1.start(); t2.start(); }
eg:/** * 任务类 * @author sx * @version 1.0 2020年10月28日 */ public class MyRunnable implements Runnable{ /** * 重写父接口中任务方法 */ @Override public void run() { for (int i = 1; i <=10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } } public static void main(String[] args) { //创建任务对象 MyRunnable m1=new MyRunnable(); MyRunnable m2=new MyRunnable(); //创建线程对象 Thread t1=new Thread(m1); Thread t2=new Thread(m2); //启动线程 t1.start(); t2.start(); }
eg:/** * 线程子类 * @author sx * @version 1.0 2020年10月28日 */ public class MyThread extends Thread{ /** * 有参构造,给线程取名 * @param string */ public MyThread(String name) { super(name); } /** * 重写父类中任务方法 */ @Override public void run() { for (int i = 1; i <= 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } }
eg:public static void main(String[] args) throws InterruptedException { for (int i = 6; i >=1; i--) { System.out.println(i); Thread.sleep(1000); } }
eg:public static void main(String[] args) { //创建线程对象 MyThread t1=new MyThread(); MyThread t2=new MyThread(); //给线程取名 t1.setName("线程A"); t2.setName("线程B"); //设置线程优先级 t1.setPriority(Thread.MIN_PRIORITY); t2.setPriority(Thread.MAX_PRIORITY); //启动线程 t1.start(); t2.start(); }
eg:public static void main(String[] args) throws InterruptedException { //创建子线程对象 Thread t1=new Thread(new Runnable() { /** * 重写父接口中任务方法 */ @Override public void run() { for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } }, "线程A"); //启动子线程对象 t1.start(); for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); //当主线程运行10时,让子线程A合并过来 if (i==10) { t1.join(); } } }
eg:public class MyThread extends Thread{ //声明一个属性存线程对象 public MyThread t; /** * 任务方法 */ @Override public void run() { for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); //当子线程B运行10时,让子线程A合并过来 if (i==10&&Thread.currentThread().getName().equals("线程B")) { try { //this指代线程B对象 this.t.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } public static void main(String[] args) throws InterruptedException { //创建线程对象 MyThread tA=new MyThread(); MyThread tB=new MyThread(); //给线程取名 tA.setName("线程A"); tB.setName("线程B"); //给对象的属性赋值,让线程A作为线程B对象的一个属性 tB.t=tA; tA.t=null; //启动线程 tA.start(); tB.start(); }
eg:public static void main(String[] args) { //创建线程对象 Thread ta=new Thread(new Runnable() { /** * 重写父接口中任务方法 */ @Override public void run() { for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } }, "线程A"); //启动线程 ta.start(); for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); //主线程每运行一次就礼让一次 Thread.yield(); } }
eg:public static void main(String[] args) throws InterruptedException { //创建线程对象 Thread ta=new Thread(new Runnable() { /** * 重写父接口中任务方法 */ @Override public void run() { for (int i = 1; i <=100; i++) { //判断当前的线程中断状态是否为true if (Thread.currentThread().isInterrupted()==true) { break; } System.out.println(Thread.currentThread().getName()+":"+i); } } }, "线程A"); //启动线程 ta.start(); for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); //当主线程运行10时,中断子线程A的执行 if (i==10) { //改变子线程当前中断状态 ta.interrupt(); //主线程休眠将资源让出来,这样子线程的中断才会生效 Thread.sleep(2000); } } }
eg:public class InterruptTest2 { //声明一个变量作标记,标记子线程是否中断,默认不中断 static boolean flag=false; public static void main(String[] args) throws InterruptedException { //创建线程对象 Thread ta=new Thread(new Runnable() { /** * 重写父接口中任务方法 */ @Override public void run() { for (int i = 1; i <=100; i++) { //判断当前的线程中断标记是否为true if (flag) { break; } System.out.println(Thread.currentThread().getName()+":"+i); } } }, "线程A"); //启动线程 ta.start(); for (int i = 1; i <=100; i++) { System.out.println(Thread.currentThread().getName()+":"+i); //当主线程运行10时,中断子线程A的执行 if (i==10) { //改变中断标记 flag=true; //让主线休眠,这样子线程就能抢到资源运行生效 Thread.sleep(1000); } } } }
eg:public static void main(String[] args) { //创建线程对象 Thread t1=new Thread(new Runnable() { /** * 重写父接口中任务方法 */ @Override public void run() { for (int i = 1; i <=1000; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } }, "守护线程"); //设置子线程为守护线程 t1.setDaemon(true); //启动线程 t1.start(); for (int i = 1; i <=10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } }
*当一个线程调用sleep()或wait()时,这个线程就处于阻塞状态.
总结:
1.了解HashTable和Properties
2.集合的总结(重点)
3.异常定义及分类
4.异常的处理机制(try-catch-finally和throws)(重点)
5.自定义异常
6.进程和线程的定义及区别(重点)
7.实现线程的两种方式(重点)
8.给线程取名
9.继承Thread VS 实现Runnable接口的方式实现多线程(重点)
10.实现线程的第三种方式(了解)
11.线程休眠(重点)
12.线程优先级(了解)
13.线程合并(重点)
14.线程礼让(了解)
15.线程中断(重点)
16.守护线程
17.线程生命周期(重点)
18.线程池(重点)