黑马程序员——线程Thread一(线程创建)
来源:互联网 发布:相思相见知何日 编辑:程序博客网 时间:2024/04/30 23:31
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
线程在java语言中是很重要的东西,我们需要牢固掌握好,线程在后期的应用是非常多的。线程的应用提高了程序的并发性,几个线程可以同步完成一个目的,会提高效率。一个程序,如果单线程顺序执行,如果在某一环节出现缓慢的,后面的就会效率低。如果用多个线程同时去处理这个问题,出现问题的环节,对整个程序的影响将会降低。所以熟练掌握好线程十分重要。
一什么时线程?
在了解线程是什么之前,我们需要先了解什么进程。
进程就是一个正在执行中的程序,每一个进程都有一个执行顺序,或者叫一个控制单元。
线程就是进程中的那个独立的控制单元,线程控制着进程的执行。
创建线程的方法:
方法一
定义类继承Thread;
复写Thread类中的run方法;
调用线程的start方法
class Demo extends Thread{//继承Thread private String name ; Demo(String name){ this.name = name; } public void run(){//复写run方法 for(int x = 0; x < 10; x++){. System.out.println(name + "...x=" + x + "...ThreadName=" + Thread.currentThread ().getName()); } } } class ThreadDemo{ public static void main(String[] args){ Demo d1 = new Demo("我是线程1");//创建线程,并线程命明 Demo d2 = new Demo("我是线程2"); d1.start(); // 开启线程,调用 run 方法。 d2.start(); for(int x = 0; x < 20; x++){ System.out.println("x = " + x + "...over..." + Thread.currentThread().getName()); } } }
( run方法:用于存储线程中要运行的代码)
(start方法:的两个动作:启动线程和调用run方法)
run():仅仅是对象调用,而线程创建了没运行
start():开启线程并执行该线程中的run方法。
创建线程的第二种方式,实现Runable接口
1.定义类实现Runnable接口。
2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。
3.通过Thread类创建线程对象
4.并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。(因为线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。)
5.调用线程对象的start方法开启线程
// 准备扩展 Demo 类的功能,让其中的内容可以作为线程的任务执行。// 通过接口的形式完成。 class Demo implements Runnable{ public void run(){ show(); } public void show(){ for(int x = 0; x < 20; x++){ System.out.println(Thread.currentThread().getName() + "..." + x); } } }class ThreadDemo{ public static void main(String[] args){ Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); t2.start(); } }
方法一和方法二的区别在于,方法二的实现方式,避免了方式一的单继承限制问题。此外实现Runable方法还有一个好处:,将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面向对象的思想将任务封装成对象。
如果多线程有共享数据,建议使用Runable方法。
Thread类、Runnable接口内部源码关系模拟代码:
class Thread{ private Runnable r ; Thread(){ } Thread(Runnable r){ this.r = r; } public void run(){ if(r !=null) r.run(); } public void start(){ run(); } }class ThreadImpl implements Runnable{ public void run(){ System.out.println("runnable run" ); } }class ThreadDemo4{ public static void main(String[] args){ ThreadImpl i = new ThreadImpl(); Thread t = new Thread(i); t.start(); } }class SubThread extends Thread{ public void run(){ System.out.println("hahah" ); } }class ThreadDemo5{ public static void main(String[] args){ SubThread s = new SubThread(); s.start(); } }
四个售票员售卖100张票示例:
public class Ticketer extends Thread { public static int ticket=100; @Override public void run() { while (true) { if (ticket > 0) { System.out.println(currentThread().getName() + "---" + ticket--); } else break; } }}public class TicketDemo { public static void main(String[] args){ Ticker2 ticker2=new Ticker2(); Thread t1=new Thread(ticker); Thread t2=new Thread(ticker); Thread t3=new Thread(ticker); Thread t4=new Thread(ticker); t1.start(); t2.start(); t3.start(); t4.start();}}
- 黑马程序员——线程Thread一(线程创建)
- 黑马程序员——线程Thread
- 黑马程序员——线程Thread二(线程安全)
- 黑马程序员——Thread.interrupt()清除线程冻结状态
- 黑马程序员——Thread线程的使用
- 黑马程序员_<<线程,Thread>>
- 黑马程序员-java-线程(Thread)
- 黑马程序员—线程
- 黑马程序员 — 线程
- 黑马程序员--线程一
- 黑马程序员——线程的创建与应用
- 黑马程序员——Java多线程之创建线程
- 黑马程序员—多线程(上)-线程及其创建方法
- 黑马程序员—创建线程的二种方式
- 黑马程序员_java创建线程
- 黑马程序员-创建线程方式
- 黑马程序员-线程Thread学习笔记
- 黑马程序员——线程
- [LeedCode OJ]#169 Majority Element
- Linux下安装Python3
- extjs4 之单元格编辑 获取列对象
- Android IM(五)连接断开重连
- Linux内核设计与实现--学习笔记--第三章- 1(task_struct等)
- 黑马程序员——线程Thread一(线程创建)
- Android系统自带样式(android:theme)
- 深入理解RunLoop
- 不使用Sencha Cmd,创建EXT-JS应用
- UVA11990 ``Dynamic'' Inversion (树状数组套平衡树)
- 论文笔记 《What makes for effective detection proposals?》
- C#堆内存分配和栈内存分配
- Java____进程、线程学习、处理器调度(转)
- [LeedCode OJ]#171 Excel Sheet Column Number