java入门 -- 多线程与线程安全

/*

* 进程:

* 定义:运行中的程序称为进程,进程负责内存空间的分配;

*

* 说明:单核cpu在一致时间翩只能运行一个程序。所有运行的程序实际上是在争夺CPU的使用权,cpu在短时间内快速切换来执行不同的程序;

* 这就是多任务运行实现机制;

*

* 线程:

*  定义:线程负责代码的执行

*  运行任何一个java程序的时候,jvm都会创建一个main线程,并执行main中的代码

* 一个java应用程序至少有2个线程,一个是main线程,负责执行代码,一个是垃圾回收器线程负责回收垃圾

*

*多线程的好处:

* 1. 一个进程同时执行多个任务;

* 2. 提高了资源的利用率;

*

*多线程的弊端

* 1. 增加了cpu的负担;

* 2. 降低了一个进程中线程的执行概率:

* 2. 出现了死锁的问题;

*

*创建多线程

* 方式一:

* 1. 定义一个子类去继承Thread类;

* 2. 重写Thread的run方法:

* 说明:jvm创建的主线程所运行的代码就是main方法中的代码,而自定义的线程所要执行的代码是放在run方法中的,重写的目的是把自定义线程所要运行的代码放入到run方法中.

* 3. 创建THread的子类对象,调用Start()方法开启线程;

* 说明:一旦开启了线程,jvm就会自动执行run方法中的代码,而不能手动调用run方法,否则就会像调用普通方法一样而不会开启新进场;


* 方式二:

** 线程创建方式二:

* 1, 自定义一个类实现Runnable接口;

* 2. 实现Runnable的run方法, 把自定义线程代码放在run方法中;

* 3. 创建Runnable实现类的对象;

* 4. 创建Thread类的对象;将Runnable实现类的对象传递给Thread类的构造函数;

*  5. 调用Thread类对象的start方法;

*

* 注意的问题:

* 1. Runnable的实现类对象并不是线程对象,而是Runnable的实现类而已。只有Thread和Thread的子类对象才是线程duix

* 2. 将Runnable的实现类对象作为参赛传递给Thread的作用是将其run方法中代码传递给Thread对象,底层是Thread中

* 的run方法调用了传递过来的Runnable实现类对象中的run方法.

*线程的生命周期


/*

* 线程类常用方法

* Thread(String anem) 初始化线程的方法

*

* getName() 返回线程的方法

* sleep() 指定线程的睡眠时间,毫秒为单位,sleep是静态方法,那个静态方法执行了该方法,那么就是那个线程睡眠;

* getPriority() 返回当前线程的优先级, 默认线程的优先级是5

* setPriority(int newPriority) 设置线程的优先级,虽然设置了线程的优先级,但是具体取决于底层的操作系统的实现(最大的优先级是10,最小的是1,默认为5);

* currentThread() 返回cpu正在执行的线程数;静态方法,那么线程执行了该方法就返回当前线程对象

*线程安全问题:

* 1. 出现原因: 有多个线程共享数据

* 2. 有多个语句操作共享数据;

* 线程同步机制:

* 方式一: 同步代码块

* 使用格式:

* synchronized(锁对象)

* { 同步代码;...}

* 注意:

* 1. 锁对象可以是任意的对象,只要是对象都可以;

* 原理是任何对象内部都隐式维护了一个状态变量(非静态成员变量),而同步机制就利用这了这个状态来实现锁机制;

* 2. 在同步代码块中调用了sleep()方法,那么在线程休眠的时候不会释放锁;

* 3. 只有真正出现线程安全问题,才使用同步代码块来解决;

* 4. 同步代码块中使用的锁必须是唯一的,不能使用匿名对象;因此要使用静态对象;

* 最简单的方式是使用一个字符串常量,因为字符串存在于字符串常量池中,是共享的.

*

* 方式二:同步函数

* 使用synchronized修饰一个函数

* 格式:

* synchronized 函数名(){}

* 注意:

* 1. 如果synchronized修饰非静态成员函数,那么线程锁是this对象,如果是静态成员函数,那么线程锁是函数所在类的字节码文件;

* 2. 同步函数的锁对象是固定的,不能修饰;

*

* 说明:推荐使用同步代码块

* 1. 同步代码块的锁对象可以随意指定,方便控制,同步函数的锁是固定的,不能指定:

* 2. 同步代码块可以方便需要同步代码的范围,同步函数必须是函数中的整个代码:

*/

public class Demo17 extends Thread {

@Override

public void run() {

// TODO Auto-generated method stub

super.run();

for(int i=0; i<10000; i++)

{

System.out.println("我是自定义线程" + i);

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//创建自定义线程对象

Demo17 d17 = new Demo17();

d17.start();

for(int i=0; i<10000; i++)

{

System.out.println("我是主线程" + i);

}

}

}

线程创建方式二:

public class Demo5 implements Runnable{

@Override

public void run() {

// TODO Auto-generated method stub

for(int i=0; i<100; i++)

{

System.out.println(Thread.currentThread().getName()+"自定义线程"+i);

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Demo5 d3 = new Demo5();

Thread td = new Thread(d3, "张三儿");

td.start();

for(int i=0; i<100; i++)

{

System.out.println("Main方法的线程"+i );

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,986评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,482评论 1 15
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 7,379评论 3 87
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 4,782评论 12 45
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399