一直想写写关于多线程的东西都没有准备好,今天这篇算是开篇吧!当然开篇都是最简单的东西,后边会陆续的写几篇关于多线程的应用的文章的。
众所周知的是多线程的实现有两种方式 方式一:继承Thread类的方式:
创建一个继承于Thread类的子类 重写Thread类的run() --> 将此线程执行的操作声明在run()中 创建Thread类的子类的对象 通过此对象调用start():①启动当前线程 ② 调用当前线程的run()方式二:实现Runnable接口的方式:
创建一个实现了Runnable接口的类 实现类去实现Runnable中的抽象方法:run() 创建实现类的对象 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象 通过Thread类的对象调用start()两种方式的对比:
开发中:优先选择:实现Runnable接口的方式 原因:1. 实现的方式没类的单继承性的局限性 2. 实现的方式更适合来处理多个线程共享数据的情况。
联系:public class Thread implements Runnable
相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。 目前两种方式,要想启动线程,都是调用的Thread类中的start()。
用伪代码来表示:
//1. 创建一个继承于Thread类的子类 class MyThread extends Thread { //2. 重写Thread类的run() @Override public void run() { for (int i = 0; i < 100; i++) { if(i % 2 == 0){ System.out.println(Thread.currentThread().getName() + ":" + i); } } } } public class ThreadTest { public static void main(String[] args) { //3. 创建Thread类的子类的对象 MyThread t1 = new MyThread(); //4.通过此对象调用start():①启动当前线程 ② 调用当前线程的run() t1.start(); //问题一:我们不能通过直接调用run()的方式启动线程。 // t1.run(); //问题二:再启动一个线程,遍历100以内的偶数。不可以还让已经start()的线程去执行。会报IllegalThreadStateException // t1.start(); //我们需要重新创建一个线程的对象 MyThread t2 = new MyThread(); t2.start(); //如下操作仍然是在main线程中执行的。 for (int i = 0; i < 100; i++) { if(i % 2 == 0){ System.out.println(Thread.currentThread().getName() + ":" + i + "***********main()************"); } } } } class Window1 implements Runnable{ private int ticket = 100; @Override public void run() { while(true){ if(ticket > 0){ System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket); ticket--; }else{ break; } } } } public class WindowTest1 { public static void main(String[] args) { Window1 w = new Window1(); Thread t1 = new Thread(w); Thread t2 = new Thread(w); Thread t3 = new Thread(w); t1.setName("窗口1"); t2.setName("窗口2"); t3.setName("窗口3"); t1.start(); t2.start(); t3.start(); } }多线程的使用是安全的吗?如何保证多线程的安全呢?随着多线程的使用会有好多关于多线程的相关问题会随之而来。在后边的博客中我也会逐渐的把多线程的问题都写出来的。
不是所有的场合都适合多线程的使用,使用多线程要注意的问题也不少。反正我当初是踩了很多的坑,所以要想不踩坑就继续关注我的博客吧!!