线程创建

作者: 今晚开什么码  发布:2019-10-05

线程--继承Thread,线程--thread

率先承接Thread类,然后重写Thread类的run()方法。

Thread类的子类的指标调用start()方法,然后虚构机就能够调用该线程的run()方法。

当程序试行到start()方法时,线程运行,此时有两条推行路线,一条是主方法施行main方法,另一条是线程路线实践线程run()里的代码,两条路径交替试行(交替试行指抢夺cup实行时间,所以每便试行结果都分化)

class ThreadDemo extends Thread
{
    public void run()//存储线程要执行的代码
    {  
         for(int i = 0; i < 60; i++)
         {
               System.out.println("线程 " + i);
         }
    }   
}



class ThreadTest
{
    public static void main(String[] args)
    {
          ThreadDemo thread = new ThreadDemo();
          thread.start();//线程启动,并执行该线程的run()方法,main路径和线程交替执行

          for(int i = 0; i < 60; i++)
         {
               System.out.println("mian " + i);
         }
    }
}

首先承继Thread类,然后重写Thread类的run()方法。 Thread类的子类的对象调用start()方法,然后虚构机就能够调用该线...

主线程:推行主方法的线程,就叫做主线程

单线程程序:程序从mani伊始从上到下依次运营

程序从main方法起首运营,JVM运营main方法,会找操作系统
开拓一条通往cpu的施行路线,cpu能够通过那条路线来施行main方法
这条渠道有一个名字叫主(main)线程

开创线程格局一承继Thread类
落到实处步骤:
1.创建Thread类的子类
2.重写Thread类中的run方法,设置线程的职务
3.成立Thread类的子类对象
4.调用Thread类中的start方法开启三个新的线程,施行run方法
使该线程起头试行;Java 设想机调用该线程的 run 方法。
结果是多少个线程并发地运维;当前线程(main线程)和另一个线程(推行 run 方法的线程)。
往往开发银行一个线程是地下的。极度是当线程已经终结实施后,不能够再重复起动。

打印的结果出现了随机性:
拉开四个线程,对于cpu就挑选权利
喜欢什么人,就进行何人,所以就出现了随机性结果

 1 public class MyThread extends Thread{
 2     /*
 3      * 2.重写Thread类中的run方法,设置线程的任务
 4      * 开启这个线程要干什么事情
 5      */
 6     @Override
 7     public void run() {
 8         for (int i = 0; i < 50; i++) {
 9             System.out.println("run..."+i);
10         }
11     }
12 }
13     public static void main(String[] args) {
14         //3.创建Thread类的子类对象
15         MyThread mt = new MyThread();
16         //mt.run();//不会开启线程,还是单线程程序
17         //4.调用Thread类中的start方法开启一个新的线程,执行run方法
18         mt.start();
19         
20         new MyThread().start();
21         
22         for (int i = 0; i < 50; i++) {
23             System.out.println("main..."+i);
24         }
25     }

线程的称号:
主线程:"main"
展开的任何线程的称谓:"Thread-0","Thread-1"....

获得线程的名号
1.Thread类中的方法getName
String getName() 重回该线程的名称。
2.Thread类中的静态方法,获取当前正值实践的线程
static Thread currentThread() 重回对方今正在举办的线程对象的引用。
安装线程的称号:
1.Thread类中的方法setName(String name)
void setName(String name) 退换线程名称,使之与参数 name 同样。
2.子类增添带参构造,调用父类Thread类的带参构造方法,传递线程的名称,让父类给线程起名字(让阿爸给外甥起名字)
Thread(String name) 分配新的 Thread 对象。

开创线程方式—实现Runnable接口

落到实处步骤:
1.创造Runnable接口的兑现类
2.重写Runnable接口中的run方法,设置线程职务
3.创建Runnable接口的兑现类对象
4.创立Thread类对象,构造方法中流传Runnable接口的兑现类
Thread(Runnable target) 分配新的 Thread 对象。
5.调用Thread类中的方法start,开启线程试行run方法

实现Runnable的好处
1.幸免了类继承Thread类之后,无法继续另外的类(单承继的局限性)
2.把设置线程职务,和开启线程举办解耦,巩固了扩展性
金玉锦绣类的效劳:就是设置线程任务
Thread类的效应:开启线程
好处:传递分歧的贯彻类,实现类重写的办法不均等,能够调用分歧的办法

线程的无名内部类使用

无名氏:没盛名字
中间类:写在任何类内部的类(成员职分:成员内部类,局地地方(方法中):局地内部类)

佚名内部类的格式:
new 父类/接口(){
重写父类/接口中的方法;
};

三十二线程的父类:
Thread
Runnable

1  new Thread(){
2             //重写run方法,设置线程任务
3             @Override
4             public void run() {
5                 for (int i = 0; i < 20; i++) {
6                     System.out.println(Thread.currentThread().getName()+":"+i);
7                 }
8             }
9         }

上述一批代码便是一个创建子类重写父类方法的进度
相当于: new MyThread().start();

次第现身了线程安全主题材料:卖了双重的票和不设有的票

杀鸡取蛋方案:
先是种形式:能够选择同步代码块

synchronized(锁对象){
发出安全主题材料的代码;
做客了分享数据的代码;
}

注意:
务须要确定保证多少个线程使用的是同多个锁对象
//在成员任务上创办三个锁对象(保障独一)

 1 Object obj = new Object();
 2     
 3     @Override
 4     public void run() {
 5         //让卖票重复执行
 6         while(true){
 7         
 8              * 同步代码块
 9              * 程序会频繁的判断锁,获取锁,释放锁,所以会降低速度
10              
11             synchronized (obj) {
12                 if(ticket>0){
13                     //为了提高安全问题的概率,让程序睡眠
14                     try {
15                         Thread.sleep(10);
16                     } catch (InterruptedException e) {
17                         e.printStackTrace();
18                     }
19                     //卖票ticket--
20                     System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");
21                 }
22             }
23         }
24     }

前后相继出现了线程安全主题材料:卖了再一次的票和不真实的票

应用方案:
第三种艺术:同步方法

使用手续:
1.把大概出现安全难点的代码收取到多个艺术中
2.把办法扩大七个首要字synchronized
修饰符 synchronized 重回值类型 方法名(参数){
也许出现安全主题材料的代码;
做客了分享数据的代码;
}

一道方法运用的锁对象是什么?
运用的就是本类对象new RunnableImpl()-->叫this

静态的一块方法,使用时如何锁对象?
应用的是本类对象的class属性(反射)
RunnableImpl.class

 1 *@Override
 2     public void run() {
 3         //让卖票重复执行
 4         while(true){
 5             payTicket2();
 6         }
 7     }
 8     
 9     
10      * 静态的同步方法
11      
12     public static synchronized void payTicket2(){
13         synchronized (RunnableImpl.class) {
14             if(ticket>0){
15                 //为了提高安全问题的概率,让程序睡眠
16                 try {
17                     Thread.sleep(10);
18                 } catch (InterruptedException e) {
19                     e.printStackTrace();
20                 }
21                 //卖票ticket--
22                 System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");
23             }
24         }
25     }
26     
27     
28     
29      * 抽取出一个同步方法
30      * 快捷键:alt+shift+m
31      
32     public ynchronized void payTicket1() {
33         synchronized (this) {
34             //System.out.println(this);//cn.itcsat.demo10.RunnableImpl@67064
35             if(ticket>0){
36                 //为了提高安全问题的概率,让程序睡眠
37                 try {
38                     Thread.sleep(10);
39                 } catch (InterruptedException e) {
40                     e.printStackTrace();
41                 }
42                 //卖票ticket--
43                 System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");
44             }
45         }
46     }

程序出现了线程安全难点:卖了再也的票和不设有的票
*
* 建设方案:
* 第三种艺术:使用Lock接口,JDK1.5随后出现的
*
* java.util.concurrent.locks.Lock接口
* 方法:
* void lock() 获取锁。
* void unlock() 释放锁。
* 接口的兑现类:ReentrantLock
*
* 完成步骤:
* 1.在成员职责成立七个Lock接口的贯彻类对象ReentrantLock
* 2.在大概出现线程安全难点的代码前,调用lock方法获得锁
* 3.在大概出现线程安全难点的代码后,调用unlock方法释放锁
*
*1.在成员职分成立叁个Lock接口的兑现类对象ReentrantLock
Lock l = new ReentrantLock();

 1 @Override
 2     public void run() {
 3         //让卖票重复执行
 4         while(true){
 5             //2.在可能出现线程安全问题的代码前,调用lock方法获取锁
 6             l.lock();
 7                 if(ticket>0){
 8                     //为了提高安全问题的概率,让程序睡眠
 9                     try {
10                         Thread.sleep(10);
11                         //卖票ticket--
12                         System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");
13                     } catch (InterruptedException e) {
14                         e.printStackTrace();
15                     }finally {
16                         //3.在可能出现线程安全问题的代码后,调用unlock方法释放锁
17                         l.unlock();    
18                     }
19                 }
20         }

 

本文由今晚开什么码发布于今晚开什么码,转载请注明出处:线程创建

关键词: