java线程基本知识
如何去定义一个线程?(三种方式)
1.Thread:继承这个类,然后重写run方法;将业务逻辑或任务写到run方法中,然后调用start来启动线程;
2.Runnable: 实现这个接口,然后重写run方法,创建Thread对象将Runnable实现类对象作为参数传递,最后调用start启动线程;
3.Callable<T>:实现这个接口,然后重写Call方法;
---扩展---
面试问题:Runnable和Callable有什么不同?
包;
泛型;
方法;
启动方式;
执行完成之后Runnable结束,Callable没有结束;
多线程并发问题:由于线程之间是有相互抢占资源导致程序出现不符合常理的问题
锁:通过synchonized来锁定一段代码,需要一个对象,锁对象要求是所有的线程都得认识:共享资源、类的字节码
wait()---让当前执行的线程等待,直到被唤醒才会继续执行
notify()---唤醒在等待的线程
通过wait/notify/notifyAll方法来调节线程之间的运行顺序---线程间的相互通信---等待唤醒机制
当调用wait方法的时候,线程会去线程池中等待。而线程池本质上是一个存储线程的队列
---扩展---
面试题总结:wait和sleep有什么区别?
sleep方法需要指定一个沉睡时间,到点自然醒,释放执行权,不释放锁,是一个静态方法,被设计在了Thread类上
wait方法可以指定时间也可以不指定,需要通过notify来唤醒。释放执行权,释放了锁,是一个普通的方法,被设计在了Object类上
线程的基本状态:

所有状态:
1,创建状态
在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时,它已经有了相应的
内存空间和其他资源,但还处于不可运行状态。新建一个线程对象可采用Thread 类的构造方法来实现,例
如,“Thread thread=new Thread();”。
2,就绪状态
新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时,
线程将进入线程队列排队,等待CPU 服务,这表明它已经具备了运行条件。
3,运行状态
当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象
的run()方法。run()方法定义了该线程的操作和功能。
4,堵塞状态
一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作时,将让出
CPU 并暂时中止自己的执行,进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因被
消除后,线程才可以转入就绪状态。
5,死亡状态
线程调用stop()方法时或run()方法执行结束后,即处于死亡状态。处于死亡状态的线程不具有继续运
行的能力。
线程代码练习:
public class synchronizedDemo {
public static void main(String[] args) {
syns s = new syns();
synDemo syn = new synDemo(s);
synDemo2 syn2 = new synDemo2(s);
new Thread(syn).start();
new Thread(syn).start();
new Thread(syn2).start();
new Thread(syn2).start();
//new Thread(syn).start();
}
}
class synDemo implements Runnable{
private syns s;
public synDemo(syns s) {
this.s = s;
}
@Override
public void run() {
synchronized(s){
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// try {
// s.wait();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
for (int i = 0; i < 3; i++) {
String name = Thread.currentThread().getName();
System.out.println(name+":"+i);
}
//s.notify();
}
}
}
class synDemo2 implements Runnable{
private syns s;
public synDemo2(syns s) {
this.s = s;
}
@Override
public void run() {
synchronized (s) {
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
for (int i = 0; i < 3; i++) {
String name = Thread.currentThread().getName();
System.out.println(name+":"+i);
}
}
}
}
class syns {
private int a = 8;
}
java线程基本知识的更多相关文章
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- java线程基础知识----java daemon线程
java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- java线程入门知识
为什么需要多线程? . 模型的简化,如某些程序是由多个相对独立任务的运行: . 图形界面的出现,输入.输出的阻塞 . 多核CPU的更好利用 . 异步行为的需要 Java多线程的特性: . 程序的入口m ...
- Java 线程基础知识
前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...
- Java 线程基本知识
线程 线程和进程 进程 : 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程 : 线程是进程中的一个执行单元(执行路径 ...
- java线程基础知识----java线程模型
转载自http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html 1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标 ...
- java线程基础知识----SecurityManager类详解
在查看java Thread源码的时候发现一个类----securityManager,虽然很早就知道存在这样一个类但是都没有深究,今天查看了它的api和源码,发现这个类功能强大,可以做很多权限控制策 ...
随机推荐
- stout代码分析之二:None类
stout库中为了避免使用NULL带来的风险,统一用None表示空. None类的实现方式如下: struct None {}; 奇怪的是, Nothing类实现方式与None一模一样..让人怀疑作者 ...
- uva 11424
uva 11424 GCD - Extreme (I) 题意:思路:(见http://www.cnblogs.com/Duahanlang/p/3184994.html ) 差别在于数据规模和时间,其 ...
- j2ee 项目部署指引
j2ee相关的项目一般是web工程或java application,部署到linux服务器上,本文结合自己的经验.教训,总结下部署的过程. 一.准备阶段 部署前要做的事情: 1.明确自己的产品都包含 ...
- 【Tools】Windows下Github的配置和使用
1.在网址:http://windows.github.com/下载git软件,具体的安装步骤可以参见:Windows 系统下Git安装图解 2.同样根据上面的教程生成SSH key: 3.将publ ...
- vijos 1907 DP+滚动数组
描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告 ...
- 重复代码Duplicated Code---要重构的信号
什么时候需要重构,当你在项目代码里面嗅到这个味道的时候,就要进行重构. 首个介绍的味道是重复代码的味道. 它表现出来的特征是这些: 1.一个类里面,两个函数中,含有相同的代码,类似的代码: ...
- [uva11991]map和vector的入门
给你一个长度为n的数组,进行m次询问,每次询问输入k和v,输出第k次出现v时的下标是多少. n<=1e6 用vector动态开空间,map使数值结合.map每次查找效率大约为logn. map的 ...
- 我要AFO啦好伤感啊
我要AFO啦 虽然一直很垃圾 但是也很开心 接下来我要去学物理啦 原因是今天早上没有吃早餐?! 就这样把~ 白白
- js中的document.ready
1.概念 表示在dom结构绘制完成后执行,可能DOM元素关联的部分并未加载完 2.写法 $(document).on("ready",function(){ }) $(docume ...
- 【EverydaySport】健身笔记——人体肌肉分解图
正面 背面 大肌肉群:胸.背.腿大肌肉群. 建议一周锻炼一次. 小肌肉群:肩.二头肌.三头肌.小臂.小腿.腹肌小肌肉群. 可以一周安排两次. 小腿.小臂肌群属于耐受肌群可以一周安排3次. 建议初学者就 ...