java基础12多线程
2016-02-11 23:05
225 查看
/*
* 如何在我们自定义的程序中去创建一个线程(执行路径,控制单元)呢?
* 如何让自定义的线程运行我们执行的代码,可以和主线程同时执行呢?
*
* 如何创建一个线程呢?
* 其实java中对线程这类事物已经进行了描述,并提供了相应的对象,
* 这个对象就是Thread
*
* 通过API查询,发现Thread类描述时,有两种创建线程的方式
* 方式1;定义一个类,继承Thread类,并复写Thread类中的run方法。
*
* 主线程运行的代码都在main函数中
* 自定义线程运行都在run方法中。
*
* 直接创建Thread类的子类就是创建一个线程,
*在内存中其实:1,堆内存中产生了一个对象,2,需要调用了底层资源,去创建执行路径
*
*如果直接调用该对象的run方法,
* 这时,底层资源并没有完成线程的创建和执行
* 仅仅是简单的对象调用方法的过程,所以这时,执行控制流程的只有主线程,
*
*如果想要开启线程,需要去调用Thread类中另一个方法完成
*start方法完成,该方法做了两件事,1,开启线程,2,调用了线程的run方法
*
*线程是随机型的,
*随机性的原理是:windows中的多任务同时执行,其实就是多个应用程序在同时执行,
*
*线程中的几个方法,
*多线程的创建,为了对各个线程进行标示,它们有一个自己默认的名称。
*格式:Thread-编号,编号从零开始,
*
*如何获取主线程对象呢?通过currentThread()返回当前线程对象,该方法是静态的,
*
*static Thread currentThread():获取当前线程对象,
*String getName():获取线程名称;
*void setName:设置线程的名称
*Thread(String name):构造函数,线程对象一建立就可以指定名称,
*
*创建线程方式2:实现runnable方法:
*
*创建线程的两种方式:
* 1,继承Thread类
* 步骤:
* 1,定义类继承Thread
* 2.覆盖Thread类中的run方法
* 3.创建Thread类的子类对象创建线程
* 4,调用Thread类中的start方法开启线程,并执行子类中的run方法。
*
* 特点:
* 1.当类去描述事物,事物中有属性和行为
* 如果行为中有部分代码需要被多线程所执行,同时还在操作属性,
* 就需要继承Thread类,产生该类的对象作为线程的对象
* 可是这样做会导致每一个对象中都存储一份属性数据
* 无法在多个线程中共享数据
* 2,如果一个类明确了自己的父类,他就不能在继承Thread
*
* 实现runnable,避免了单继承的局限性。
*
*
* 线程安全问题:因为多条操作功能数据的代码被多个线程分开执行造成的。
* 安全问题涉及的内容
* 1,共享数据
* 2,是否被多条语句操作,
*
* 解决安全问题的方式,
* java提供了一个同步机制,
* 解决原理:让多条
4000
操作共享数据的代码在某一时间段,被一个线程执行完,在执行过程中,其他线程不可以参与运算,
* 同步格式;
* 同步代码块:
* synchronized(对象)//该对象可以是任意对象,
* {
* 需要被同步的代码
* }
*/
class TicketWin implements Runnable{
private int tickets=100;
public void run() {
// TODO Auto-generated method stub
while(true){
if(tickets>0){
System.out.println(tickets--);
}
}
}
}
class ThreadDemo extends Thread{
private String name;
ThreadDemo(String name){
this.name=name;
}
public void run(){
for(int x=0;x<100;x++){
for(int y=0;y<99999;y++){}//为了减缓程序的执行
System.out.println("name="+name);
}
}
}
class MainThread{
public static void main(String[] args){
/* ThreadDemo d1=new ThreadDemo("one");//创建一个Thread类的子类对象,其实就是在创建一个线程,
ThreadDemo d2=new ThreadDemo("two");
*/
//创建线程对象,要么是Thread类的对象,要么是Thread类的子类对象,
TicketWin t=new TicketWin();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
/*d1.start();
d2.start();*/
}
}
* 如何在我们自定义的程序中去创建一个线程(执行路径,控制单元)呢?
* 如何让自定义的线程运行我们执行的代码,可以和主线程同时执行呢?
*
* 如何创建一个线程呢?
* 其实java中对线程这类事物已经进行了描述,并提供了相应的对象,
* 这个对象就是Thread
*
* 通过API查询,发现Thread类描述时,有两种创建线程的方式
* 方式1;定义一个类,继承Thread类,并复写Thread类中的run方法。
*
* 主线程运行的代码都在main函数中
* 自定义线程运行都在run方法中。
*
* 直接创建Thread类的子类就是创建一个线程,
*在内存中其实:1,堆内存中产生了一个对象,2,需要调用了底层资源,去创建执行路径
*
*如果直接调用该对象的run方法,
* 这时,底层资源并没有完成线程的创建和执行
* 仅仅是简单的对象调用方法的过程,所以这时,执行控制流程的只有主线程,
*
*如果想要开启线程,需要去调用Thread类中另一个方法完成
*start方法完成,该方法做了两件事,1,开启线程,2,调用了线程的run方法
*
*线程是随机型的,
*随机性的原理是:windows中的多任务同时执行,其实就是多个应用程序在同时执行,
*
*线程中的几个方法,
*多线程的创建,为了对各个线程进行标示,它们有一个自己默认的名称。
*格式:Thread-编号,编号从零开始,
*
*如何获取主线程对象呢?通过currentThread()返回当前线程对象,该方法是静态的,
*
*static Thread currentThread():获取当前线程对象,
*String getName():获取线程名称;
*void setName:设置线程的名称
*Thread(String name):构造函数,线程对象一建立就可以指定名称,
*
*创建线程方式2:实现runnable方法:
*
*创建线程的两种方式:
* 1,继承Thread类
* 步骤:
* 1,定义类继承Thread
* 2.覆盖Thread类中的run方法
* 3.创建Thread类的子类对象创建线程
* 4,调用Thread类中的start方法开启线程,并执行子类中的run方法。
*
* 特点:
* 1.当类去描述事物,事物中有属性和行为
* 如果行为中有部分代码需要被多线程所执行,同时还在操作属性,
* 就需要继承Thread类,产生该类的对象作为线程的对象
* 可是这样做会导致每一个对象中都存储一份属性数据
* 无法在多个线程中共享数据
* 2,如果一个类明确了自己的父类,他就不能在继承Thread
*
* 实现runnable,避免了单继承的局限性。
*
*
* 线程安全问题:因为多条操作功能数据的代码被多个线程分开执行造成的。
* 安全问题涉及的内容
* 1,共享数据
* 2,是否被多条语句操作,
*
* 解决安全问题的方式,
* java提供了一个同步机制,
* 解决原理:让多条
4000
操作共享数据的代码在某一时间段,被一个线程执行完,在执行过程中,其他线程不可以参与运算,
* 同步格式;
* 同步代码块:
* synchronized(对象)//该对象可以是任意对象,
* {
* 需要被同步的代码
* }
*/
class TicketWin implements Runnable{
private int tickets=100;
public void run() {
// TODO Auto-generated method stub
while(true){
if(tickets>0){
System.out.println(tickets--);
}
}
}
}
class ThreadDemo extends Thread{
private String name;
ThreadDemo(String name){
this.name=name;
}
public void run(){
for(int x=0;x<100;x++){
for(int y=0;y<99999;y++){}//为了减缓程序的执行
System.out.println("name="+name);
}
}
}
class MainThread{
public static void main(String[] args){
/* ThreadDemo d1=new ThreadDemo("one");//创建一个Thread类的子类对象,其实就是在创建一个线程,
ThreadDemo d2=new ThreadDemo("two");
*/
//创建线程对象,要么是Thread类的对象,要么是Thread类的子类对象,
TicketWin t=new TicketWin();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
/*d1.start();
d2.start();*/
}
}
相关文章推荐
- java中的构造方法
- java中的this
- java常见问题
- Java—设计模式(工厂模式)
- 栈的应用--四则运算表达式求值(java代码)
- JAVA比较两个日期相差的天数
- Arcgis server java develop begining
- Gradle教程Part2:java工程
- Java开发环境搭建
- java基础总结 --- enum枚举实现多路分发 石头、剪刀、布游戏示例
- The Java™ Tutorials — Concurrency :Memory Consistency Errors 内存一致性错误
- Spark学习笔记7-在eclipse里用scala编写spark程序(单机和集群运行)
- JDK中自带xml和对象互转方法
- 蓝桥杯 算法训练 最小乘积(基本型)
- JAVA常见基本术语
- java synchronized详解(转载)
- Java多线程ExecutorService.shutdown什么时候执行
- 总结-Java何时需要使用多线程
- 20个非常有用的Java程序片段
- 蓝桥杯 算法训练 图形显示