百搜论坛欢迎您的加入!
adimg adimg
 
昨日:篇  今日:篇   总帖:篇   会员:
今日:0    总帖:312
admin
1537
宝塔破解版已更新脚本简介本次面板版本:7.4.2本脚本支持一键安装79版宝塔面板 以及 已经安装宝塔面板升级79版!感谢大家使用该脚本,本脚本未加密,有没有后门大家自己看就知道了,仅仅将官方的脚本本地化了,未经任何修改,请放心使用!本次脚本支持:Centos 7、Debian、Ubuntu!宝塔面板 7.4.2 安装命令Centos安装命令:根据系统执行框内命令开始安装(大约2分钟完成面板安装) yum install -y wget && wget -O install.sh http://bt.79mz.cn/install/install_6.0.sh && sh install.sh试验性Centos/Ubuntu/Debian安装命令 独立运行环境(py3.7) 可能存在少量兼容性问题 不断优化中:极速安装方式 (安装时间1至10分钟)curl -sSO http://bt.79mz.cn/install/install_panel.sh && bash install_panel.shUbuntu/Deepin安装命令:极速安装方式 (安装时间1至10分钟)wget -O install.sh http://bt.79mz.cn/install/install-ubuntu_6.0.sh && sudo bash install.shDebian安装命令:极速安装方式 (安装时间1至10分钟)wget -O install.sh http://bt.79mz.cn/install/install-ubuntu_6.0.sh && bash install.shFedora安装命令:极速安装方式 (安装时间1至10分钟)wget -O install.sh http://bt.79mz.cn/install/install_6.0.sh && bash install.sh已经安装面板Linux面板7.4.2升级命令:极速安装方式 (安装时间1至10秒)wget -O /home/update6.sh http://bt.79mz.cn/install/update6.sh && bash /home/update6.sh收费版Nginx防火墙脚本收费Nginx防火墙(面板先安装在执行脚本):直接面板安装防火墙使用,不在出现不显示拦截问题,不需要在配合bt命令!Apache防火墙脚本收费Apache防火墙(面板先安装在执行脚本):直接面板安装防火墙使用,不在出现不显示拦截问题,不需要在配合bt命令!宝塔相关说明1、所有资料搜集与网络仅供学习交流。2、链接失效或者其他问题,请联系邮箱:210676369@qq.com3、所有收取的费用,仅用于维系网站运营,性质为友情赞助,并非售卖文件费用。4、如侵犯您的权益,请联系管理员。易木资源 » 宝塔面板专业版7.4.2破解版一键脚本(长期更新)
0 0 1314天前
admin
1177
1.现在虚拟机中配置好域名指向的网站目录2.然后在本机的hosts文件中将虚拟机ip(192.168.xx.xx)指向域名。在虚拟机的hosts文件中配置无效。
0 0 1314天前
admin
1165
  字节跳动,应当说成近些年掘起速率较为快的互联网公司。  抖音短视频、今日头条两网络平台拥有人数千万的客户人群。  下边人们就大伙儿简易解读注册难题:  1.注册字节跳动小程序  店家必须在字节跳动智能化小程序服务平台官网首页(),点一下右上方的“快捷登录”按键,注册一个字节跳动小程序开发者服务平台账号。  2.注册并登陆。  初次建立小程序,必须填好企业资质等內容根据审核即可启用,请在申请办理前准备好有关必填材料  3.等候审核。  申请信息填好结束后等候审核結果, 假如申请办理不通过,必须依据意见反馈信息内容再次填写信息递交。  4.递交有关资质证书注册小程序。  审核根据以后,可进到后台管理健全和管理方法目前小程序,或建立新的小程序。  现阶段只能公司行为主体的小程序,才可以启用付款能力。  5.构建并公布发布小程序。  抖音短视频小程序开发,必须具有一定的开发能力,要是没有技术专业的团体,提议找技术专业的小程序开发企业。开发完你立即应用就好了。  在开发进行之后,可自主根据字节跳动开发者专用工具提交编码并根据字节跳动小程序服务平台进行小程序审核、小程序公布实际操作。
0 0 1321天前
admin
1318
 手机微信小程序的火爆,让愈来愈多行业的店家和公司刚开始利用它来占领总流量通道,手机微信绿色生态月活十亿用户,早已变成移动互联时期最重要的绿色生态了。  现如今,无论你是干什么的,不弄个小程序早已过时了。启用小程序,最先最重要的便是营销推广拓客,小程序用完即走的“轻”特点,给网友产生了挺大的便捷,可是就现阶段而言小程序的通道尽管愈来愈丰富多彩,但依然处于一个探寻和健全的环节。  用户用完即走,针对小程序而言,要想办法让用户二次浏览乃至数次浏览,不仅是情景上的用户存留,只是多情景用户的不断应用,才可以产生高些的转换。那麼小程序发布之后应当怎样快速推广呢?小诺小结了下列五个方式。  1.公众号关联与文章  现阶段手机微信适用公众号和小程序的相通关联。手机微信公众号能够迅速关联和建立小程序,小程序还可以呈现公众号的內容。已关联的小程序可被应用在文图信息、自定莱单、模板信息和周边的小程序等情景中。  公众号可关联同行为主体的10个小程序及不一样行为主体的三个小程序。同一个小程序可关联数最多500个公众号。根据手机微信公众号后台管理的小程序管理方法作用,只必须简易实际操作便可进行关联和建立,并进行不一样情景的呈现。  公众号关联小程序还会继续根据消息提醒通告用户。公众号关联,针对现有公众号,而且累积了一定粉絲的企业而言,能够迅速将总流量导进小程序。  关联后还能够在公众号推原文中插进小程序卡牌或是连接。假如你的公众号可以生产制造高品质內容得到很多阅读量,针对小程序营销推广而言也是一个迅速合理的方式。  2.检索关键词提升  先前手机微信小程序以前对外开放过「自定关键词」这一作用,小程序能够依据自身的知名品牌和产品类型设定关键词。可是在4月份,这一作用早已关掉。  很可能是一部分小程序店家利用这一作用舞弊,造成关键词不有关,或是故意堆积关键词。尽管这一作用早已关掉,但并不意味着我们无法对关键词开展提升。  如今手机微信小程序改成由系统软件全自动分派关键词,店家和初创公司能够依据标准有效设定名字和功能介绍字段名,在名字中有效反映有关行业关键词,在功能介绍里将产品定位、作用叙述、产品类别等內容简约合理的呈现出去。  针对关键词的提升,一定要遵守纪律,有效适当,假如在名字和叙述详细介绍内太过堆积,很可能被手机微信小程序官方网处罚。  在7月份的微信公开课上,手机微信表达将来可能对小程序开展一系列的升級,在其中包含对外开放知名品牌和知名品牌检索,很可能再一次对外开放自定关键词作用,而且颁布一系列标准,要是有效利用,对产品推广会有挺大的积极意义。  3.小程序广告词  现阶段微信官网的广告投放平台早已适用小程序广告词。关键分成公众号广告词、小游戏广告、微信朋友圈广告。而內容有关的小程序内也刚开始适用广告的投放,根据不一样方式的广告营销,能够考虑不一样行业小程序店家的要求。  也是有一些第三方的总流量开放平台,也是小程序广告营销的非常好挑选,这种广告营销可选方式大量,呈现方法也更丰富,乃至能够跳出来微信客户端,根据app、网址、自媒体等方式开展广告营销。  根据广告词来营销推广小程序,较大 的优点是能够得到精确的数据信息,目的性的进行剖析和改善。可是广告词成本费也很高,小程序店家和初创公司要量力而为,切忌盲目跟风。  4.二维码  小程序还可以生成二维码,现阶段小程序早已适用个人收藏作用,已个人收藏的小程序会在微信聊天页面的顶端下拉列表呈现,根据二维码在不一样情景的宣传策划利用,能够合理做到营销推广目地。针对小程序营销推广而言,二维码的利用分成线上和线下二种方式。  网上,能够根据微信朋友圈共享,微信聊天群分享,网址、app图片广告词、推广软文嵌入等多种多样方法开展消息推送。  线下推广主要是一些主题活动原材料的宣传策划和第三方支付情景的利用。  5.服务平台招商合作  商品销售型的企业通常都必须招商合作方式的基本建设,根据代理加盟、020平台创建分销策略。创建小程序服务平台的招商合作方式,吸引住创业人添加,能够快速将商品扩展至不一样的地区和用户人群。  招商合作渠道营销关键有招商合作合作伙伴大型活动、各种各样销售渠道推广、依靠第三方招商合作等方法。依靠第三方推广平台,相对性前二种方法成本费更低,还可以快速累积意愿名册。  无论是对于不一样行业的小程序运用,還是小程序开发设计服务提供商全是一个非常好的挑选。挑选推广平台,要考虑到服务平台的总流量、用户人群、营销推广适用幅度多种多样要素,也要遵照放长线钓大鱼的标准,多试几个服务平台比照下实际效果,会对实际效果有梗形象化的了解。  小程序想得到大量的用户,除开搞好营销推广,也必须对产品功能、用户感受,经营模式开展打磨抛光和包裝。只能搞好这种,才可以利用各种推广营销方法完成裂变式。
0 0 1321天前
admin
1292
当说到百度权重那么难题来了,坚信有很多工作员们都这个方面很感兴趣,由于要了解百度权重和网站排行要什么的关系,也许就有许多人会问,那么如何能够能够很快的提升百度权重呢?1.通常新的网站的话,它的权重值是很低的,要是你在新站期内改动题目或是设定过关键字的话,那么会遭遇搜索引擎的升级,进入沙盒期,你要是愿意提高权重值,必需要保证每日网址稿子一切正常更新,并且外链必须做的有规律性,切忌操之过急。2.网站友情链接这一块儿都是能够有利于权重值的提高,可是当你在网站加上添加友情链接的时候,必需要多检查友情链接是不是一切正常或,还是有被K的情况降权的情况,那么要是出現这样的事情的话,就要防止网址被连累,就趁早把它删掉,并且网站也不提议多加友链的。3.网站稿子是不是原创內容还是采集內容,网站文章的网站更能让百度收录提升,相对采集的內容更非常容易被搜索引擎发现,放入沙盒期展开观察,因而早期的稿子原创度这一块儿都是非常关键。所以就是说要想提高网站权重值的话,必需不可以让网站在搜索引擎的沙盒期里觉得你的网址有一切违规的行为,所以必须要妥善处理好,干万不可以一心的想提高权重值而使用违规的方式。
0 0 1325天前
admin
1131
下面信息如实填写就行,然后耐心等待审核即可。审核通过以后,会接收到如下消息然后点击就可以进入“小商店助手”小程序,这次再点击免费开店,就可以开通微信小商店了。然后选择企业或者个人,这里和你申请内测时填写的类型必须一致,建议用企业类型的,这样支持的功能比较多。选择好以后,我们就可以去电脑网页上登录管理后台,设置了。登录网址:https://mp.weixin.qq.com 然后就是用你申请小商店的微信扫码登录。扫码完成后,记得选择小商店登录小商店登录成功以后,会有登录提醒。登录成功以后,如下图然后点击去开张,填写小商店信息,按照下图所示的4个步骤来。步骤一填写完成后,会出现下面的审核等待,等待时长很短。步骤一审核的同时,也会验证你填写的银行账户验证过程中,我们可以先去填写基本信息如果没有品牌代理,就选择无品牌然后就等待审核完成后就可以开张营业了由于这个审核比较慢,等审核通过以后,再给大家更新后续操作。
0 0 1326天前
admin
1198
必备条件1,必须注册微信支付的商户号2,企业小程序必须通过认证3,小程序关联微信支付商户号一,小程序关联微信商户1,登录小程序后台,点击关联更多商户号2,关联商户号需要用到appid,点击如下所示的关联更多AppID把我们小程序的appid复制下然后去授权关联我们的微信支付商户号授权完成以后,我们的小程序端会出现下面这样的,点击下确认即可。这样我们就可以成功的关联微信支付商户号了点击下上图的确认,然后再点击下图所示的授权。可以看到我们的小程序和微信商户号成功的关联起来了二,开通云开发并绑定微信商户号1,然后新建小程序,开始代码部分。这里的appid一定要是你关联过微信支付商户的,并且还得是企业小程序。这里创建项目时记得选择不使用云服务,因为使用默认云开发的话,会创建一大堆无用的文件。2,开通云开发功能3,给你的云开发环境起个名,英文或者拼音然后点击确定,等待创建云开发,创建好以后如下。4,然后点击设置,全局配置,可以看到有个微信支付配置有的同学这里看不到微信支付配置,是因为你的小程序开发工具版本过低。最好下载最新版本的开发者工具。5,云开发配置微信商户号。添加完以后还需要手机上进行授权确认6,手机微信上进行确认可以看到这里已经授权绑定了退款的我们后面会再讲。这个时候我们准备工作就全部做好了,接下来就要愉快的写代码。三,云开发支付代码的编写1,看官方文档,其实说的很详细了,接下来我带大家过一遍。这里也把官方链接贴出来给大家。https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html其实官方有给我们完整的示例。我们只需要把这段代码复制到我们自己的云函数里就行了。2,创建云开发统一支付的云函数我们首先要创建云函数的根目录然后新建云函数pay0610然后把官方示例直接复制到我们自己的云函数里3,把云函数里的信息替换成我们自己的上面标注重要的是一定要替换成自己的。然后保存修改,部署云函数4,编写页面在index.wxml里写一个按钮,点击的时候调起我们的支付云函数然后在index.js里编写点击事件我们这个时候直接点击支付,看看会不会调起支付这个时候一大堆爆红,仔细看下,可以看出我们云开发环境id没有初始化。5,app.js里配置云开发环境id这里取到环境id然后在app.js里配置然后我们再点击下支付,可以看到我们成功的调起了支付6,然后我用手机微信支付下试试支付成功后,我们的控制台也会有相应的日志打印。到这里我们就可以成功的在小程序里使用微信支付了,后面无非把价格和商品名字做活,做成动态传入的。后面我也会把源码放到网盘里,有需要的同学,去我公号‘编程小石头’里回复‘云开发支付’就可以获取了。视频讲解:https://edu.csdn.net/course/detail/25701
0 0 1326天前
admin
1317
学习编程能锻炼孩子的哪些技能还是老规矩,我们先看效果图这是当前全世界一款主流的编程教学软件叫Scratch,是由麻省理工学院的“终身幼儿园团队”开发的图形化编程工具,主要面对青少年开放。Scratch将复杂的程序变为一个个积木块,孩子无需敲击代码或是背诵任何编程指令,只要用鼠标将积木块拖拽并连接在一起,就可以很方便的进行编程。孩子们使用Scratch创作出属于自己的动画、游戏、交互程序,培养综合能力,获得学习和创造的乐趣。比较适合5-10岁的孩子做编程启蒙使用。今天呢,就来教大家如何在家里安装这么一款软件,来开启孩子的编程大门。一,进入Scratch官网下载离线编辑器这是官网地址https://scratch.mit.edu/进入官网以后,拉到最底部有个Download,直接点击下载。如果你不喜欢英文界面,也可以切换中文。页面换成中文以后,点击下载即可。选择对应的操作系统,直接下载由于官网是国外网站,有时候打开可能比较慢。我这里提前把安装包给大家准备好了。如果你在官网下载比较慢,可以找石头哥索取安装包。二,安装Scratch离线编辑器安装也很简单,只需要双击即可。直接点击安装即可下面就是安装进度了。等待安装成功即可三,打开Scratch离线编辑器。第一次打开可能有点慢,耐心等待即可。上图就是打开后的编辑器。主要的区域我都标注出来了。这一节的Scratch软件安装就讲到这里了,下一节开始,我们就来教大家属性里面的一些功能。然后家长朋友学会后,就可以在家带娃学编程了。
0 0 1326天前
admin
1170
老规矩,先看效果图一,首先要给你的小程序开通直播插件功能登录我们的小程序后台,可以看到如下图所示的直播点击一下,就可以进入小程序直播开通页面注意我们上图红色框里的一些要求。必须要满足这些条件,才可以开通直播功能。更详细些的如下:这就注定目前只能是通过认证的企业小程序才可以开通直播功能了。个人小程序目前是没法开通的。我刚开始还不信,用我的个人小程序试了试。结果就如下图,后面没办法就注册了一个企业小程序。并且小程序的服务类目也要符合官方要求到这里,才算真正开通了小程序直播功能。二,创建直播间点击创建直播间选择手机直播这里需要用一个实名认证的微信做主播端。认证后如下:这里设置直播的一些封面等信息直播间创建成功后如下这里的直播码,扫码后就可以直接开播了,还有这里的房间号一定要记牢,后面会用到。这里可以往直播间里添加商品,优惠券等下面就是根据官方文档来代码实现直播功能了三,直播功能的代码实现我们创建号直播间以后,接下来就要在小程序代码里实现直播功能了。1,首先是要创建一个小程序项目至于如何创建小程序项目我这里就不再教大家了,如果你还不知道如何创建小程序项目,建议你去翻下我的历史文章,或者看看我录的《10小时零基础入门小程序开发》 创建好的小程序项目如下2,在app.json里添加直播插件其实官方的接入文档写的很清晰了。下面把官方文档贴出来给大家:https://developers.weixin.qq.com/miniprogram/dev/framework/liveplayer/live-player-plugin.html我们只需要把上面红色框里的代码复制到app.json里就可以了。记得把注释去掉一定要记得,除了把注释去掉之外,其他的都不要做改动。3,然后编写可以跳转到直播间的代码代码很简单,就写一个button按钮,然后添加点击事件即可。点击事件如下其实官方文档里也有讲直播房间的房间id我们在创建直播间成功后其实可以拿的到的。到这里我们的直播功能就完整的实现了。下面我们来看看都有哪些直播状态四,直播状态的显示未开播状态,这里我们可以订阅开播提醒,等开播的时候,会有订阅消息提醒。如果你订阅开播提醒了,还会有开播提醒直播结束状态主播暂时离开主播端网络异常中断主播端可以设置美颜等功能并且我们的小程序直播间里可以设置优惠券,抽奖,添加商品。直播结束后,还有回放功能好,到这里就给大家把小程序直播功能完整的讲解完了。由于代码量太少,实现起来比较简单,所以就不给大家录讲解视频了。
0 0 1326天前
admin
1256
老规矩,以图为证新加分享到朋友圈的按钮分享到朋友圈的效果分享成功打开朋友圈分享链接后的效果可以看到底部有个前往小程序,这样我们就可以在朋友圈里直接打开小程序了。是不是很激动,接下来就教大家如何实现小程序分享到朋友圈的功能吧。小程序分享到朋友圈的代码编写默认的分享到朋友圈的按钮是灰色的,如下图或许你都想象不到,小程序分享到朋友圈真是太简单了。只需要下面这几行代码,并且这几行代码是小程序页面的默认配置。onShareAppMessage是我们默认就有的配置,也就是onShareTimeline是我们新加的,其实你只要配置好onShareTimeline这段代码,就可以轻松的实现小程序分享到朋友圈功能了。来看下官方的文档其实小程序分享到朋友圈只需要满足下图红色框里的两个条件。而这两个条件很好满足,就是我们这两行代码注意点还有一点要注意的,就是我们要想使用小程序分享到朋友的功能,必须1,使用最新版的开发者工具2,使用最新版的调试库到这里我们就轻松的实现小程序分享到朋友圈的功能了,赶紧给你的小程序添加这个功能吧。
0 0 1326天前
admin
1372
先来说下市面上一些主流的内网穿透方法穿透工具入门简易度价格Ngrok简单免费/付费(几元每月)Natapp简单免费/付费(几元每月)花生壳简单付费(偏贵)Ssh、autossh难免费Frp难付费Lanproxy难付费Spike难付费#今天就来讲讲这几个配置比较简单的Ngrok项目主页:https://ngrok.com/项目介绍: 一个通过任何NAT或防火墙为您的本地主机服务器提供即时访问、安全的URL的命令。类似花生壳,分为服务端和客户端,也可以自己搭建服务端。使用教程:点击跳转**优点:**傻瓜式配置,5分钟就能配置好,有免费式**缺点:**配置在国外,每次访问会很慢花生壳项目主页:https://hsk.oray.com/项目介绍:商业化比较成功的内网穿透。个人开发很不推荐,收费贵,企业可以考虑使用。Natapp项目主页:https://natapp.cn/项目介绍:基于ngrok的国内的内网穿透工具,类似花生壳,有免费版本,比花生壳好。免费版本:提供http,https,tcp全隧道穿透,随机域名/TCP端口,不定时强制更换域名/端口,自定义本地端口。收费版本也就几元每月。综合对比下这几个简单的内网穿透,我个人比较中意natapp,下面就来讲下natapp配置内网穿透的步骤。一,官网注册https://natapp.cn/这个我不用说了,进官网注册就行二,购买隧道(免费/收费都有)我们这里可以选择免费隧道,免费的需要实名认证,我这里是用了9元一个月的隧道(个人建议买这个)配置信息先和我保持一致即可。三,下载客户端https://natapp.cn/#download下载对应的即可下载后,解压,然后把解压出来的文件放到一个目录里。然后命令行里:cd /Users/qcl/packages/natapp 进入到你放置natapp文件的目录里。再输入ls,查看natapp软件是否存在。mac运行下面两步进入到目录后输入下面命令行chmod a+x natapp是为所有用户开启执行命令 (如果不加这一步 也可以直接用sudo+第二步运行软件)然后输入./natapp这一步是运行命令win用户直接双击.exe文件即可这里提示我们认证错误,错误是因为authtoker没有配置,所以我们需要在命令行里运行下面命令./natapp -authtoken=你的authtoken值 1而这个authtoken值,我们可以到管理后台去找如箭头所指,就是我们想要的authtoken然后命令行里运行运行上面命令行时会出现下面结果这就代表我们成功把外网http://a11*********98.natapp.cc -> 127.0.0.1:8080映射到我们本地的服务器了,这时候我们通过外网网址,就可以访问我们本地服务器了。但是。。。。。。natapp提供给我们的网址,不能直接访问,这时我们就要去做另外一个配置了。绑定本站二级域名或自主域名后进行访问之所以这么做,也是为了安全。下面我们就继续来讲怎么绑定本站二级域名或自主域名。如果你有自己的备案域名,可以参考官方文档https://natapp.cn/article/beian如果你没有自己的备案域名,就需要再去注册一个二级域名了。我这里拿自己的微信号,注册一个二级域名。注册完二级域名后,再去修改隧道配置点击配置选中二级域名修改成功后,我们的域名就会变成我们的二级域名然后再次在命令行里运行可以看到我们的域名已经变了到这里我们就配置成功了,去验证下手机微信访问这时候我们就可以愉快的实现内网穿透了这样外网就能轻松的访问到我们本地电脑的服务器了。做微信开发时,就可以愉快的在我们本地做调试了。
0 0 1326天前
admin
1146
一.下载Vmware安装包(此处我安装的是VMware-workstation-full-14.1.3)链接: https://pan.baidu.com/s/12xT1JaA7eheEgFfM-2klVg 提取码: 2ysg并完成安装 二.下载待使用的Linux版本(此处我下载的是CentOS-6.9-x86_64-bin-DVD1) 三.打开VM 选择创建新的虚拟机---->点击创建虚拟机---->选择自定义安装---->到选择虚拟机兼容性,本文是VM14的版本,选择了14.X---->选择刚下载的linux文件---->配置虚拟机信息(用户名:amanda,密码:123)---->配置虚拟机安装地址---->配置处理器数量,不能超过最大核心限制,选择过大会有提示的。---->配置内存---->配置网络1) 桥接网络:Bridged network 借助物理设备网卡和外在网络通讯的一种机制 笔记本一般有无线网卡和有线网卡,可选择桥接的网卡 2) 仅主机模式:Host- Only 通过虚拟交换机(虚拟网卡)实现虚拟机间的通信,不能和host通信 虚拟交换机(虚拟网卡)不同物理主机网卡连接 3)NAT模式:Network Address Translation 网络地址转换,以实现虚拟网卡和物理网卡间的连接,可与外部主机(宿主host、其他host)通信 (作者:lee_zhou 来源:CSDN 原文:https://blog.csdn.net/qq_35206244/article/details/79339453 )---->I/O选择默认---->磁盘选择默认 ---->创建虚拟磁盘---->指定磁盘容量 ---->指定磁盘文件 ---->完成 ---->界面 精品源码推荐:http://github.crmeb.net/u/defu
0 0 1326天前
admin
1142
一、CentOS7.4下载          官网下载地址:http://vault.centos.org/    1、进入CentOS下载官网,找到CentOS7.4版本  2、在CentOS7.4版本页面中,找到isos/    3、进入页面后,可以看到x86_64  4、在CentOS下载页面中,选择 CentOS-7-x86_64-DVD-1708.torrent进行下载 5、下载完成之后,由于“CentOS-7-x86_64-DVD-1708.torrent”只是一个BT种子文件,而且非常小,这就需要我们使用迅雷等工具来对源镜像进行下载了   (1)打开迅雷,新建任务,把“CentOS-7-x86_64-DVD-1708.torrent”BT种子文件拖入到新建任务中,并点击立即下载    (2)下载完成之后会生成如下的几个文件,CentOS-7-x86_64-DVD-1708.iso就是我们在工作中使用的镜像了  二、CentOS7.4安装   1、打开你的VMware Workstation Pro,并点击“创建新的虚拟机”,没有安装VMware Workstation Pro请点击VMware Workstation 14下载与安装 2、点选典型(推荐)(T),并点击“下一步” 3、点选稍后安装操作系统(S),并点击“下一步”  4、点选Linux(L),因为我们之前下载的 CentOS-7-x86_64-DVD-1708.iso 是64位 7.4版本的,所以这里我们选择CentOS 7 64位,并点击“下一步” 5、虚拟机名称可以更改也可以不更改看自己需求,修改虚拟机的安装路径,并点击“下一步” 6、磁盘选择默认为20.0GB,点选将虚拟磁盘存储为单个文件(O),并点击“下一步” 7、点击“完成” 8、点击“编辑虚拟机设置” 9、点选“使用ISO映像文件(M)”,并添加我们之前下载好的CentOS-7-x86_64-DVD-1708.iso 10、默认为NAT 模式(N):用于共享主机的IP地址即可 提示:11-13步骤 移除USB控制器、声卡和打印机 只是为了腾出更多的资源空间 (可以选择跳过 不移除)11、选择USB 控制器,并点击“移除(R)” 12、选择声卡,并点击“移除(R)” 13、选择打印机,并点击“移除(R)”,最后点击“确定” 14、点击“开启此虚拟机” 15、正在开启虚拟机,鼠标移入到虚拟机中,并按下“↑”键,选择Install CentOS 7,最后按下“Enter 键”        提示:  鼠标移动到虚拟机内部单击或者按下Ctrl + G,鼠标即可移入到虚拟机中                     按下Ctrl + Alt,鼠标即可移出虚拟机        注意:  在虚拟机中的操作,鼠标必须要移入到虚拟机中,否则虚拟机感应不到,无法对其进行操作 16、按下“Enter 键” 17、默认安装过程中的安装界面使用English (英语),点击“Continue” 18、配置时区 (DATE & TIME)       (1)选择DATE & TIME              (2)时区设置为 Region:Asia    City:Shanghai                日期和时间 设置与自己的电脑时间同步,最后点击“Done” 19、设置软件选择 (SOFTWARE SELECTION)         (1)选择SOFTWARE SELECTION               (2)点击勾选 Compatibility Libraries 和 Development Tools 如果希望安装带有界面的CentOS,请在左边Base Environment中,选择Server with GUI(带图形用户界面的服务器),默认为Minimal Install (最小安装),提示:如果安装有界面版本的,在如下的第22步骤中的操作会有所不同 (安装有界面版本的其实用处不大,都是可以通过命令行来设置的),这里我没有安装有界面版本的 20、设置安装位置 (INSTALLATION DESTINATION)      (1)选择INSTALLATION DESTINATION    (2)点选 I will configuire parttioning,然后再点击“Done”  (3)更改模式,标准分区Standard Partition,点击“+”按钮添加分区     (4)添加 /boot分区,大小300MB,Add mount point (5)添加 swap分区,一般情况是物理内存的2倍大小,用于物理内存不足时使用,但可能造成系统不稳定,所以看情况,可以设置小一点,甚至设置为0MB,这里我设置为512MB,Add mount point (6)增加根分区,不填写大小,即默认剩余的空间都给根分区,Add mount point (7)点击“Done” (8)点击“Accept Changes” 21、点击“Begin Installation”,开始安装 22、设置系统用户root的密码 (ROOT PASSWORD)    (1)选择ROOT PASSWORD (2)为root设置密码 (密码长度最好不要小于6位数),然后点击“Done” 23、等待安装完成,然后点击“Reboot” 三、CentOS7.4基本设置1、登录CentOS,默认账号为root,密码为 你在前面安装时设置的root密码提示:在输入密码时,linux为了安全起见,是看不到你输入的密码。同时,如果是使用的是键盘右边的数字键盘输入密码的话,建议查看一下,数字键盘是否开启 (建议使用字母按键上面一排的 数字键输入密码) 2、配置IP地址,网关cd /etc/sysconfig/network-scripts/ //进入到network-scripts目录下 vi ifcfg-ens32 //编辑配置文件 //修改以下内容BOOTPROTO=static //启用静态IP地址ONBOOT=yes //开启自动启用网络连接 //添加以下内容IPADDR=192.168.30.1 //设置IP地址NETMASK=255.255.255.0 //子网掩码GATEWAY=192.168.131.2 //设置网关    2.1、如何设置Linux的IP地址1、在本地电脑打开“命令行窗口”,输入命令ipconfig,查看 以太网适配器 VMware Network Adapter VMnet8下的IPv4 地址2、可以看到 以太网适配器 VMware Network Adapter VMnet8下的IPv4 地址为 192.168.30.23、当我们设置Linux的IP地址时,需要保证Linux的IP地址 与 VMnet8下的IPv4地址 的前面三位数必须相同,即 192.168.30 必须相同,这样Linux就能跟我们本地电脑互相通信,最后一位数不相同即可,例如Linux的IP地址可以设置为192.168.30.1 或者 192.168.30.124等  2.2、如何设置Linux的网关:1、点击编辑(E) → 虚拟网络编辑器(N)  2.3、如何设置Linux的网关,选择VMnet8,再点击"NAT设置"按钮,查看VMnet8 (NAT 模式)下的子网掩码 3、查看VMnet8 (NAT 模式)下的网关,选择VMnet8,再点击"NAT设置"按钮  3、重启网络服务service network restart 4、设置DNS地址     vi /etc/resolv.conf //编辑 resolv.conf文件 nameserver 114.114.114.114 //添加DNS地址 可以添加多个DNS地址,格式为:nameserver xxx1.xxx1.xxx1.xxx1nameserver xxx2.xxx2.xxx2.xxx2 常用的DNS地址:   阿里  223.5.5.5  或者  223.6.6.6   谷歌  8.8.8.8 国内移动、电信和联通通用的DNS 114.114.114.114 提示:如果是内网,配置上面的DNS地址有可能是访问不了外网的,在电脑右下角的网络图标中鼠标右键,选择打开"网络和Internet"设置,选择WLAN,然后在点击你连接的网络,查看网络信息 填写内网的IPv4 DNS 服务器地址即可 5、查看是否能够访问外网ping -c3 www.baidu.com PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=128 time=9.45 ms64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=128 time=12.2 ms64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=128 time=9.29 ms --- www.a.shifen.com ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2004msrtt min/avg/max/mdev = 9.296/10.346/12.293/1.388 ms 6、永久关闭 firewalld防火墙(centos7默认的防火墙是firewalld防火墙,不是使用iptables,因此需要关闭firewalld服务)systemctl stop firewalld.service // 停止firewalld服务 systemctl disable firewalld.service // 开机禁用firewalld服务 iptables -L //列出所有iptables规则 7、永久关闭SELinux防火墙vi /etc/sysconfig/selinux //编辑selinux文件 SELINUX=disabled //把文件中的SELINUX=enforcing 改成 SELINUX=disabled 即可 sestatus //查看SELinux状态 获取当前selinux防火墙的安全策略sestatus可以看到当前selinux防火墙的安全策略仍为enforcing,配置文件并未生效  这时需要我们重启,再去查看SELinux防火墙的状态,可以看到已经关闭了 8、给/etc/rc.d/rc.local 文件设置  “x”可执行权限,最初设置默认是没有可执行权限的chmod +x /etc/rc.d/rc.local //设置可执行权限 //设置前-rwxr-xr--. 1 root root 473 Aug 5 2017 rc.local //设置后-rwxr-xr-x. 1 root root 473 Aug 5 2017 rc.local 9、输入“halt”,关闭虚拟机,并拍摄快照,保存当前配置 
0 0 1326天前
admin
1341
 CentOS安装文件有两类(32位和64位),每类下载对应有不同的版本,这些版本适合不同需求的用户。      CentOS 7官方下载地址:https://www.centos.org/download/     在CentOS官方网站上,CentOS 7提供了三种ISO镜像文件的下载:DVD ISO、Everything ISO、Minimal ISO。       以下针对各个版本的ISO镜像文件,进行一一说明:         CentOS-7.0-x86_64-DVD-1503-01.iso              标准安装版,一般下载这个就可以了(推荐)         CentOS-7.0-x86_64-NetInstall-1503-01.iso       网络安装镜像(从网络安装或者救援系统)         CentOS-7.0-x86_64-Everything-1503-01.iso     对完整版安装盘的软件进行补充,集成所有软件。(包含centos7的一套完整的软件包,可以用来安装系统或者填充本地镜像)         CentOS-7.0-x86_64-GnomeLive-1503-01.iso   GNOME桌面版         CentOS-7.0-x86_64-KdeLive-1503-01.iso         KDE桌面版         CentOS-7.0-x86_64-livecd-1503-01.iso            光盘上运行的系统,类拟于winpe          CentOS-7.0-x86_64-minimal-1503-01.iso         精简版,自带的软件最少 1、点击“DVD ISO”按钮,即可下载CentOS 7 DVD ISO 镜像文件。 2、点击“Everything ISO”按钮,即可进入CentOS 7 Everything ISO镜像文件的下载页面,该页面提供了Actual Country(“实际国家”,可以解释为您此刻所在的国家,即“本国”)和 Nearby Countries(“附近国家”)的一系列 ISO 镜像文件下载链接。 Actual Country - http://mirrors.opencas.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.skyshe.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.zju.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.hust.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.pubyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.yun-idc.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.nwsuaf.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://centos.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.hustunique.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.sina.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.neu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.btte.net/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirrors.cqu.edu.cn/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso Nearby Countries - http://ftp.stu.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror01.idc.hinet.net/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.yzu.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://centos.cs.nctu.edu.tw/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.ksu.edu.tw/pub/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.isu.edu.tw/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.twaren.net/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.premi.st/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://data.nicehosting.co.kr/os/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://centos.tt.co.kr/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.daumkakao.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.kaist.ac.kr/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.neowiz.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.oasis.onnetcorp.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://centos.mirror.cdnetworks.com/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.nus.edu.sg/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.vastspace.net/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://centos.usonyx.net/main/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.vodien.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://www.ftp.ne.jp/Linux/packages/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.fairway.ne.jp/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.jaist.ac.jp/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.tsukuba.wide.ad.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.nara.wide.ad.jp/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.digitalhusky.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.logol.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.vilkam.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.tversu.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.satellite-service.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://centos-mirror.rbc.ru/pub/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.astpage.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.corbina.net/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso http://mirror.h1host.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1503-01.iso  3、点击“Minimal ISO”按钮,即可进入CentOS 7 Minimal ISO镜像文件的下载页面,该页面同样提供了Actual Country 和 Nearby Countries 的一系列 ISO 镜像文件下载链接。  Actual Country - http://mirrors.opencas.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.skyshe.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.zju.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.hust.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.pubyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.yun-idc.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.nwsuaf.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://centos.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.hustunique.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.sina.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.neu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.btte.net/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirrors.cqu.edu.cn/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso Nearby Countries - http://ftp.stu.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror01.idc.hinet.net/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.yzu.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://centos.cs.nctu.edu.tw/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.ksu.edu.tw/pub/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.isu.edu.tw/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.twaren.net/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.premi.st/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://data.nicehosting.co.kr/os/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://centos.tt.co.kr/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.daumkakao.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.kaist.ac.kr/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.neowiz.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.oasis.onnetcorp.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://centos.mirror.cdnetworks.com/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.nus.edu.sg/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.vastspace.net/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://centos.usonyx.net/main/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.vodien.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://www.ftp.ne.jp/Linux/packages/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.fairway.ne.jp/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.jaist.ac.jp/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.tsukuba.wide.ad.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.nara.wide.ad.jp/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.digitalhusky.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.logol.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.vilkam.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.tversu.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.satellite-service.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://centos-mirror.rbc.ru/pub/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.astpage.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.corbina.net/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso http://mirror.h1host.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso       其实,CentOS 7 还可以通过其它方式下载,官方网站还有一项“torrent”的下载方式。      点击“via Torrent”,进入下载页面:Actual Country - http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/ http://mirror.neu.edu.cn/centos/7/isos/x86_64/ http://mirrors.zju.edu.cn/centos/7/isos/x86_64/ http://mirror.bit.edu.cn/centos/7/isos/x86_64/ http://mirrors.163.com/centos/7/isos/x86_64/ http://mirrors.aliyun.com/centos/7/isos/x86_64/ http://mirrors.yun-idc.com/centos/7/isos/x86_64/ http://mirrors.opencas.cn/centos/7/isos/x86_64/ http://mirrors.btte.net/centos/7/isos/x86_64/ http://mirrors.nwsuaf.edu.cn/centos/7/isos/x86_64/ http://mirrors.cqu.edu.cn/CentOS/7/isos/x86_64/ http://mirrors.hust.edu.cn/centos/7/isos/x86_64/ http://centos.ustc.edu.cn/centos/7/isos/x86_64/ http://mirrors.pubyun.com/centos/7/isos/x86_64/ http://mirrors.skyshe.cn/centos/7/isos/x86_64/ http://mirrors.sina.cn/centos/7/isos/x86_64/ Nearby Countries - http://ftp.stu.edu.tw/Linux/CentOS/7/isos/x86_64/ http://ftp.yzu.edu.tw/Linux/CentOS/7/isos/x86_64/ http://centos.cs.nctu.edu.tw/7/isos/x86_64/ http://ftp.twaren.net/Linux/CentOS/7/isos/x86_64/ http://ftp.ksu.edu.tw/pub/CentOS/7/isos/x86_64/ http://ftp.isu.edu.tw/pub/Linux/CentOS/7/isos/x86_64/ http://mirror01.idc.hinet.net/CentOS/7/isos/x86_64/ http://ftp.kaist.ac.kr/CentOS/7/isos/x86_64/ http://centos.mirror.cdnetworks.com/7/isos/x86_64/ http://mirror.oasis.onnetcorp.com/centos/7/isos/x86_64/ http://mirror.premi.st/centos/7/isos/x86_64/ http://ftp.daumkakao.com/centos/7/isos/x86_64/ http://data.nicehosting.co.kr/os/CentOS/7/isos/x86_64/ http://centos.tt.co.kr/7/isos/x86_64/ http://ftp.neowiz.com/centos/7/isos/x86_64/ http://mirror.nus.edu.sg/centos/7/isos/x86_64/ http://centos.usonyx.net/main/7/isos/x86_64/ http://mirror.vodien.com/centos/7/isos/x86_64/ http://mirror.vastspace.net/centos/7/isos/x86_64/ http://ftp.jaist.ac.jp/pub/Linux/CentOS/7/isos/x86_64/ http://www.ftp.ne.jp/Linux/packages/CentOS/7/isos/x86_64/ http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/ http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/7/isos/x86_64/ http://ftp.riken.jp/Linux/centos/7/isos/x86_64/ http://ftp.nara.wide.ad.jp/pub/Linux/centos/7/isos/x86_64/ http://mirror.fairway.ne.jp/centos/7/isos/x86_64/ http://ftp.tsukuba.wide.ad.jp/Linux/centos/7/isos/x86_64/ http://mirror.corbina.net/pub/Linux/centos/7/isos/x86_64/ http://mirror.tversu.ru/centos/7/isos/x86_64/ http://centos-mirror.rbc.ru/pub/centos/7/isos/x86_64/ http://mirror.digitalhusky.com/centos/7/isos/x86_64/ http://mirror.yandex.ru/centos/7/isos/x86_64/ http://mirror.astpage.ru/centos/7/isos/x86_64/ http://mirror.satellite-service.ru/centos/7/isos/x86_64/ http://mirror.vilkam.ru/centos/7/isos/x86_64/ http://mirror.h1host.ru/centos/7/isos/x86_64/ http://mirror.logol.ru/centos/7/isos/x86_64/ 
0 0 1326天前
admin
1263
PS字体包是一款非常实用的ps字体工具集合包,用户能够在这里寻找到适合自己的字体,让你在PS设计广告的时候事半功倍,这些字体完全免费,下载即可用,有需要的用户请放心下载。安装方法  1、下载完成后解压就可以得到TTF格式的字体文件,接下来我们将需要的字体文件选中然后ctrl+c复制,也可以全选以后再复制;  2、点击桌面左下角的“开始”选项,然后在程序中找到“控制面板”选项;  3、在控制面板中点击“外观和个性化”选项,再点击界面下方的“字体”选项;  4、接下来就进入到字体界面,将复制的字体粘贴进来,粘贴完成后打开ps软件就可以使用这些字体了。免费字体
0 0 1331天前
baby
916
1 Future是什么?先举个例子,我们平时网购买东西,下单后会生成一个订单号,然后商家会根据这个订单号发货,发货后又有一个快递单号,然后快递公司就会根据这个快递单号将网购东西快递给我们。在这一过程中,这一系列的单号都是我们收货的重要凭证。因此,JDK的Future就类似于我们网购买东西的单号,当我们执行某一耗时的任务时,我们可以另起一个线程异步去执行这个耗时的任务,同时我们可以干点其他事情。当事情干完后我们再根据future这个"单号"去提取耗时任务的执行结果即可。因此Future也是多线程中的一种应用模式。扩展: 说起多线程,那么Future又与Thread有什么区别呢?最重要的区别就是Thread是没有返回结果的,而Future模式是有返回结果的。2 如何使用Future前面搞明白了什么是Future,下面我们再来举个简单的例子看看如何使用Future。假如现在我们要打火锅,首先我们要准备两样东西:把水烧开和准备食材。因为烧开水是一个比较漫长的过程(相当于耗时的业务逻辑),因此我们可以一边烧开水(相当于另起一个线程),一边准备火锅食材(主线程),等两者都准备好了我们就可以开始打火锅了。// DaHuoGuo.javapublic class DaHuoGuo { public static void main(String[] args) throws Exception { FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName() + ":" + "开始烧开水..."); // 模拟烧开水耗时 Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + ":"  + "开水已经烧好了..."); return "开水"; } }); Thread thread = new Thread(futureTask); thread.start(); // do other thing System.out.println(Thread.currentThread().getName() + ":"  + " 此时开启了一个线程执行future的逻辑(烧开水),此时我们可以干点别的事情(比如准备火锅食材)..."); // 模拟准备火锅食材耗时 Thread.sleep(3000); System.out.println(Thread.currentThread().getName() + ":"  + "火锅食材准备好了"); String shicai = "火锅食材"; // 开水已经稍好,我们取得烧好的开水 String boilWater = futureTask.get(); System.out.println(Thread.currentThread().getName() + ":"  + boilWater + "和" + shicai + "已经准备好,我们可以开始打火锅啦"); }}执行结果如下截图,符合我们的预期:从以上代码中可以看到,我们使用Future主要有以下步骤:新建一个Callable匿名函数实现类对象,我们的业务逻辑在Callable的call方法中实现,其中Callable的泛型是返回结果类型;然后把Callable匿名函数对象作为FutureTask的构造参数传入,构建一个futureTask对象;然后再把futureTask对象作为Thread构造参数传入并开启这个线程执行去执行业务逻辑;最后我们调用futureTask对象的get方法得到业务逻辑执行结果。可以看到跟Future使用有关的JDK类主要有FutureTask和Callable两个,下面主要对FutureTask进行源码分析。扩展: 还有一种使用Future的方式是将Callable实现类提交给线程池执行的方式,这里不再介绍,自行百度即可。3 FutureTask类结构分析我们先来看下FutureTask的类结构:可以看到FutureTask实现了RunnableFuture接口,而RunnableFuture接口又继承了Future和Runnable接口。因为FutureTask间接实现了Runnable接口,因此可以作为任务被线程Thread执行;此外,最重要的一点就是FutureTask还间接实现了Future接口,因此还可以获得任务执行的结果。下面我们就来简单看看这几个接口的相关api。// Runnable.java@FunctionalInterfacepublic interface Runnable {    // 执行线程任务    public abstract void run();}Runnable没啥好说的,相信大家都已经很熟悉了。// Future.javapublic interface Future<V> {    /**     * 尝试取消线程任务的执行,分为以下几种情况:     * 1)如果线程任务已经完成或已经被取消或其他原因不能被取消,此时会失败并返回false;     * 2)如果任务还未开始执行,此时执行cancel方法,那么任务将被取消执行,此时返回true;TODO 此时对应任务状态state的哪种状态???不懂!!     * 3)如果任务已经开始执行,那么mayInterruptIfRunning这个参数将决定是否取消任务的执行。     *    这里值得注意的是,cancel(true)实质并不能真正取消线程任务的执行,而是发出一个线程     *    中断的信号,一般需要结合Thread.currentThread().isInterrupted()来使用。     */    boolean cancel(boolean mayInterruptIfRunning);    /**     * 判断任务是否被取消,在执行任务完成前被取消,此时会返回true     */    boolean isCancelled();    /**     * 这个方法不管任务正常停止,异常还是任务被取消,总是返回true。     */    boolean isDone();    /**     * 获取任务执行结果,注意是阻塞等待获取任务执行结果。     */    V get() throws InterruptedException, ExecutionException;    /**     * 获取任务执行结果,注意是阻塞等待获取任务执行结果。     * 只不过在规定的时间内未获取到结果,此时会抛出超时异常     */    V get(long timeout, TimeUnit unit)        throws InterruptedException, ExecutionException, TimeoutException;}Future接口象征着异步执行任务的结果即执行一个耗时任务完全可以另起一个线程执行,然后此时我们可以去做其他事情,做完其他事情我们再调用Future.get()方法获取结果即可,此时若异步任务还没结束,此时会一直阻塞等待,直到异步任务执行完获取到结果。// RunnableFuture.javapublic interface RunnableFuture<V> extends Runnable, Future<V> {    /**     * Sets this Future to the result of its computation     * unless it has been cancelled.     */    void run();}RunnableFuture是Future和Runnable接口的组合,即这个接口表示又可以被线程异步执行,因为实现了Runnable接口,又可以获得线程异步任务的执行结果,因为实现了Future接口。因此解决了Runnable异步任务没有返回结果的缺陷。接下来我们来看下FutureTask,FutureTask实现了RunnableFuture接口,因此是Future和Runnable接口的具体实现类,是一个可被取消的异步线程任务,提供了Future的基本实现,即异步任务执行后我们能够获取到异步任务的执行结果,是我们接下来分析的重中之重。FutureTask可以包装一个Callable和Runnable对象,此外,FutureTask除了可以被线程执行外,还可以被提交给线程池执行。我们先看下FutureTask类的api,其中重点方法已经红框框出。上图中FutureTask的run方法是被线程异步执行的方法,get方法即是取得异步任务执行结果的方法,还有cancel方法是取消任务执行的方法。接下来我们主要对这三个方法进行重点分析。思考:FutureTask覆写的run方法的返回类型依然是void,表示没有返回值,那么FutureTask的get方法又是如何获得返回值的呢?FutureTask的cancel方法能真正取消线程异步任务的执行么?什么情况下能取消?因为FutureTask异步任务执行结果还跟Callable接口有关,因此我们再来看下Callable接口:// Callable.java@FunctionalInterfacepublic interface Callable<V> {    /**     * Computes a result, or throws an exception if unable to do so.     */    V call() throws Exception;}我们都知道,Callable<V>接口和Runnable接口都可以被提交给线程池执行,唯一不同的就是Callable<V>接口是有返回结果的,其中的泛型V就是返回结果,而Runnable接口是没有返回结果的。思考: 一般情况下,Runnable接口实现类才能被提交给线程池执行,为何Callable接口实现类也可以被提交给线程池执行?想想线程池的submit方法内部有对Callable做适配么?4 FutureTask源码分析4.1 FutureTask成员变量我们首先来看下FutureTask的成员变量有哪些,理解这些成员变量对后面的源码分析非常重要。// FutureTask.java/** 封装的Callable对象,其call方法用来执行异步任务 */private Callable<V> callable;/** 在FutureTask里面定义一个成员变量outcome,用来装异步任务的执行结果 */private Object outcome; // non-volatile, protected by state reads/writes/** 用来执行callable任务的线程 */private volatile Thread runner;/** 线程等待节点,reiber stack的一种实现 */private volatile WaitNode waiters;/** 任务执行状态 */private volatile int state;// Unsafe mechanicsprivate static final sun.misc.Unsafe UNSAFE;// 对应成员变量state的偏移地址private static final long stateOffset;// 对应成员变量runner的偏移地址private static final long runnerOffset;// 对应成员变量waiters的偏移地址private static final long waitersOffset;这里我们要重点关注下FutureTask的Callable成员变量,因为FutureTask的异步任务最终是委托给Callable去实现的。思考:FutureTask的成员变量runner,waiters和state都被volatile修饰,我们可以思考下为什么这三个成员变量需要被volatile修饰,而其他成员变量又不用呢?volatile关键字的作用又是什么呢?既然已经定义了成员变量runner,waiters和state了,此时又定义了stateOffset,runnerOffset和waitersOffset变量分别对应runner,waiters和state的偏移地址,为何要多此一举呢?我们再来看看stateOffset,runnerOffset和waitersOffset变量这三个变量的初始化过程:// FutureTask.javastatic {    try {        UNSAFE = sun.misc.Unsafe.getUnsafe();        Class<?> k = FutureTask.class;        stateOffset = UNSAFE.objectFieldOffset            (k.getDeclaredField("state"));        runnerOffset = UNSAFE.objectFieldOffset            (k.getDeclaredField("runner"));        waitersOffset = UNSAFE.objectFieldOffset            (k.getDeclaredField("waiters"));    } catch (Exception e) {        throw new Error(e);    }    }4.2 FutureTask的状态变化前面讲了FutureTask的成员变量,有一个表示状态的成员变量state我们要重点关注下,state变量表示任务执行的状态。// FutureTask.java/** 任务执行状态 */private volatile int state;/** 任务新建状态 */private static final int NEW          = 0;/** 任务正在完成状态,是一个瞬间过渡状态 */private static final int COMPLETING   = 1;/** 任务正常结束状态 */private static final int NORMAL       = 2;/** 任务执行异常状态 */private static final int EXCEPTIONAL  = 3;/** 任务被取消状态,对应cancel(false) */private static final int CANCELLED    = 4;/** 任务中断状态,是一个瞬间过渡状态 */private static final int INTERRUPTING = 5;/** 任务被中断状态,对应cancel(true) */private static final int INTERRUPTED  = 6;可以看到任务状态变量state有以上7种状态,0-6分别对应着每一种状态。任务状态一开始是NEW,然后由FutureTask的三个方法set,setException和cancel来设置状态的变化,其中状态变化有以下四种情况:NEW -> COMPLETING -> NORMAL:这个状态变化表示异步任务的正常结束,其中COMPLETING是一个瞬间临时的过渡状态,由set方法设置状态的变化;NEW -> COMPLETING -> EXCEPTIONAL:这个状态变化表示异步任务执行过程中抛出异常,由setException方法设置状态的变化;NEW -> CANCELLED:这个状态变化表示被取消,即调用了cancel(false),由cancel方法来设置状态变化;NEW -> INTERRUPTING -> INTERRUPTED:这个状态变化表示被中断,即调用了cancel(true),由cancel方法来设置状态变化。4.3 FutureTask构造函数FutureTask有两个构造函数,我们分别来看看:// FutureTask.java// 第一个构造函数public FutureTask(Callable<V> callable) {    if (callable == null)        throw new NullPointerException();    this.callable = callable;    this.state = NEW;       // ensure visibility of callable}可以看到,这个构造函数在我们前面举的“打火锅”的例子代码中有用到,就是Callable成员变量赋值,在异步执行任务时再调用Callable.call方法执行异步任务逻辑。此外,此时给任务状态state赋值为NEW,表示任务新建状态。我们再来看下FutureTask的另外一个构造函数:// FutureTask.java// 另一个构造函数public FutureTask(Runnable runnable, V result) {    this.callable = Executors.callable(runnable, result);    this.state = NEW;       // ensure visibility of callable}这个构造函数在执行Executors.callable(runnable, result)时是通过适配器RunnableAdapter来将Runnable对象runnable转换成Callable对象,然后再分别给callable和state变量赋值。注意,这里我们需要记住的是FutureTask新建时,此时的任务状态state是NEW就好了。4.4 FutureTask.run方法,用来执行异步任务前面我们有讲到FutureTask间接实现了Runnable接口,覆写了Runnable接口的run方法,因此该覆写的run方法是提交给线程来执行的,同时,该run方法正是执行异步任务逻辑的方法,那么,执行完run方法又是如何保存异步任务执行的结果的呢?我们现在着重来分析下run方法:// FutureTask.javapublic void run() {    // 【1】,为了防止多线程并发执行异步任务,这里需要判断线程满不满足执行异步任务的条件,有以下三种情况:    // 1)若任务状态state为NEW且runner为null,说明还未有线程执行过异步任务,此时满足执行异步任务的条件,    // 此时同时调用CAS方法为成员变量runner设置当前线程的值;    // 2)若任务状态state为NEW且runner不为null,任务状态虽为NEW但runner不为null,说明有线程正在执行异步任务,    // 此时不满足执行异步任务的条件,直接返回;    // 1)若任务状态state不为NEW,此时不管runner是否为null,说明已经有线程执行过异步任务,此时没必要再重新    // 执行一次异步任务,此时不满足执行异步任务的条件;    if (state != NEW ||        !UNSAFE.compareAndSwapObject(this, runnerOffset,                                     null, Thread.currentThread()))        return;    try {        // 拿到之前构造函数传进来的callable实现类对象,其call方法封装了异步任务执行的逻辑        Callable<V> c = callable;        // 若任务还是新建状态的话,那么就调用异步任务        if (c != null && state == NEW) {            // 异步任务执行结果            V result;            // 异步任务执行成功还是始遍标志            boolean ran;            try {                // 【2】,执行异步任务逻辑,并把执行结果赋值给result                result = c.call();                // 若异步任务执行过程中没有抛出异常,说明异步任务执行成功,此时设置ran标志为true                ran = true;            } catch (Throwable ex) {                result = null;                // 异步任务执行过程抛出异常,此时设置ran标志为false                ran = false;                // 【3】设置异常,里面也设置state状态的变化                setException(ex);            }            // 【3】若异步任务执行成功,此时设置异步任务执行结果,同时也设置状态的变化            if (ran)                set(result);        }    } finally {        // runner must be non-null until state is settled to        // prevent concurrent calls to run()        // 异步任务正在执行过程中,runner一直是非空的,防止并发调用run方法,前面有调用cas方法做判断的        // 在异步任务执行完后,不管是正常结束还是异常结束,此时设置runner为null        runner = null;        // state must be re-read after nulling runner to prevent        // leaked interrupts        // 线程执行异步任务后的任务状态        int s = state;        // 【4】如果执行了cancel(true)方法,此时满足条件,        // 此时调用handlePossibleCancellationInterrupt方法处理中断        if (s >= INTERRUPTING)            handlePossibleCancellationInterrupt(s);    }}可以看到执行异步任务的run方法主要分为以下四步来执行:判断线程是否满足执行异步任务的条件:为了防止多线程并发执行异步任务,这里需要判断线程满不满足执行异步任务的条件;若满足条件,执行异步任务:因为异步任务逻辑封装在Callable.call方法中,此时直接调用Callable.call方法执行异步任务,然后返回执行结果;根据异步任务的执行情况做不同的处理:1) 若异步任务执行正常结束,此时调用set(result);来设置任务执行结果;2)若异步任务执行抛出异常,此时调用setException(ex);来设置异常,详细分析请见4.4.1小节;异步任务执行完后的善后处理工作:不管异步任务执行成功还是失败,若其他线程有调用FutureTask.cancel(true),此时需要调用handlePossibleCancellationInterrupt方法处理中断,详细分析请见4.4.2小节。这里值得注意的是判断线程满不满足执行异步任务条件时,runner是否为null是调用UNSAFE的CAS方法compareAndSwapObject来判断和设置的,同时compareAndSwapObject是通过成员变量runner的偏移地址runnerOffset来给runner赋值的,此外,成员变量runner被修饰为volatile是在多线程的情况下, 一个线程的volatile修饰变量的设值能够立即刷进主存,因此值便可被其他线程可见。4.4.1 FutureTask的set和setException方法下面我们来看下当异步任务执行正常结束时,此时会调用set(result);方法:// FutureTask.javaprotected void set(V v) {    // 【1】调用UNSAFE的CAS方法判断任务当前状态是否为NEW,若为NEW,则设置任务状态为COMPLETING    // 【思考】此时任务不能被多线程并发执行,什么情况下会导致任务状态不为NEW?    // 答案是只有在调用了cancel方法的时候,此时任务状态不为NEW,此时什么都不需要做,    // 因此需要调用CAS方法来做判断任务状态是否为NEW    if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {        // 【2】将任务执行结果赋值给成员变量outcome        outcome = v;        // 【3】将任务状态设置为NORMAL,表示任务正常结束        UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state        // 【4】调用任务执行完成方法,此时会唤醒阻塞的线程,调用done()方法和清空等待线程链表等        finishCompletion();    }}可以看到当异步任务正常执行结束后,且异步任务没有被cancel的情况下,此时会做以下事情:将任务执行结果保存到FutureTask的成员变量outcome中的,赋值结束后会调用finishCompletion方法来唤醒阻塞的线程(哪里来的阻塞线程?后面会分析),值得注意的是这里对应的任务状态变化是NEW -> COMPLETING -> NORMAL。我们继续来看下当异步任务执行过程中抛出异常,此时会调用setException(ex);方法。// FutureTask.javaprotected void setException(Throwable t) {    // 【1】调用UNSAFE的CAS方法判断任务当前状态是否为NEW,若为NEW,则设置任务状态为COMPLETING    // 【思考】此时任务不能被多线程并发执行,什么情况下会导致任务状态不为NEW?    // 答案是只有在调用了cancel方法的时候,此时任务状态不为NEW,此时什么都不需要做,    // 因此需要调用CAS方法来做判断任务状态是否为NEW    if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {        // 【2】将异常赋值给成员变量outcome        outcome = t;        // 【3】将任务状态设置为EXCEPTIONAL        UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state        // 【4】调用任务执行完成方法,此时会唤醒阻塞的线程,调用done()方法和清空等待线程链表等        finishCompletion();    }}可以看到setException(Throwable t)的代码逻辑跟前面的set(V v)几乎一样,不同的是任务执行过程中抛出异常,此时是将异常保存到FutureTask的成员变量outcome中,还有,值得注意的是这里对应的任务状态变化是NEW -> COMPLETING -> EXCEPTIONAL。因为异步任务不管正常还是异常结束,此时都会调用FutureTask的finishCompletion方法来唤醒唤醒阻塞的线程,这里阻塞的线程是指我们调用Future.get方法时若异步任务还未执行完,此时该线程会阻塞。// FutureTask.javaprivate void finishCompletion() {    // assert state > COMPLETING;    // 取出等待线程链表头节点,判断头节点是否为null    // 1)若线程链表头节点不为空,此时以“后进先出”的顺序(栈)移除等待的线程WaitNode节点    // 2)若线程链表头节点为空,说明还没有线程调用Future.get()方法来获取任务执行结果,固然不用移除    for (WaitNode q; (q = waiters) != null;) {        // 调用UNSAFE的CAS方法将成员变量waiters设置为空        if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) {            for (;;) {                // 取出WaitNode节点的线程                Thread t = q.thread;                // 若取出的线程不为null,则将该WaitNode节点线程置空,且唤醒正在阻塞的该线程                if (t != null) {                    q.thread = null;                    //【重要】唤醒正在阻塞的该线程                    LockSupport.unpark(t);                }                // 继续取得下一个WaitNode线程节点                WaitNode next = q.next;                // 若没有下一个WaitNode线程节点,说明已经将所有等待的线程唤醒,此时跳出for循环                if (next == null)                    break;                // 将已经移除的线程WaitNode节点的next指针置空,此时好被垃圾回收                q.next = null; // unlink to help gc                // 再把下一个WaitNode线程节点置为当前线程WaitNode头节点                q = next;            }            break;        }    }    // 不管任务正常执行还是抛出异常,都会调用done方法    done();    // 因为异步任务已经执行完且结果已经保存到outcome中,因此此时可以将callable对象置空了    callable = null;        // to reduce footprint}finishCompletion方法的作用就是不管异步任务正常还是异常结束,此时都要唤醒且移除线程等待链表的等待线程节点,这个链表实现的是一个是Treiber stack,因此唤醒(移除)的顺序是"后进先出"即后面先来的线程先被先唤醒(移除),关于这个线程等待链表是如何成链的,后面再继续分析。4.4.2 FutureTask的handlePossibleCancellationInterrupt方法在4.4小节分析的run方法里的最后有一个finally块,此时若任务状态state >= INTERRUPTING,此时说明有其他线程执行了cancel(true)方法,此时需要让出CPU执行的时间片段给其他线程执行,我们来看下具体的源码:// FutureTask.javaprivate void handlePossibleCancellationInterrupt(int s) {    // It is possible for our interrupter to stall before getting a    // chance to interrupt us.  Let's spin-wait patiently.    // 当任务状态是INTERRUPTING时,此时让出CPU执行的机会,让其他线程执行    if (s == INTERRUPTING)        while (state == INTERRUPTING)            Thread.yield(); // wait out pending interrupt    // assert state == INTERRUPTED;    // We want to clear any interrupt we may have received from    // cancel(true).  However, it is permissible to use interrupts    // as an independent mechanism for a task to communicate with    // its caller, and there is no way to clear only the    // cancellation interrupt.    //    // Thread.interrupted();}1234567891011121314151617181920思考: 为啥任务状态是INTERRUPTING时,此时就要让出CPU执行的时间片段呢?还有为什么要在义务任务执行后才调用handlePossibleCancellationInterrupt方法呢?4.5 FutureTask.get方法,获取任务执行结果前面我们起一个线程在其`run`方法中执行异步任务后,此时我们可以调用`FutureTask.get`方法来获取异步任务执行的结果。// FutureTask.javapublic V get() throws InterruptedException, ExecutionException {    int s = state;    // 【1】若任务状态<=COMPLETING,说明任务正在执行过程中,此时可能正常结束,也可能遇到异常    if (s <= COMPLETING)        s = awaitDone(false, 0L);    // 【2】最后根据任务状态来返回任务执行结果,此时有三种情况:1)任务正常执行;2)任务执行异常;3)任务被取消    return report(s);}123456789101112可以看到,如果任务状态state<=COMPLETING,说明异步任务正在执行过程中,此时会调用awaitDone方法阻塞等待;当任务执行完后,此时再调用report方法来报告任务结果,此时有三种情况:1)任务正常执行;2)任务执行异常;3)任务被取消。4.5.1 FutureTask.awaitDone方法FutureTask.awaitDone方法会阻塞获取异步任务执行结果的当前线程,直到异步任务执行完成。// FutureTask.javaprivate int awaitDone(boolean timed, long nanos)    throws InterruptedException {    // 计算超时结束时间    final long deadline = timed ? System.nanoTime() + nanos : 0L;    // 线程链表头节点    WaitNode q = null;    // 是否入队    boolean queued = false;    // 死循环    for (;;) {        // 如果当前获取任务执行结果的线程被中断,此时移除该线程WaitNode链表节点,并抛出InterruptedException        if (Thread.interrupted()) {            removeWaiter(q);            throw new InterruptedException();        }        int s = state;        // 【5】如果任务状态>COMPLETING,此时返回任务执行结果,其中此时任务可能正常结束(NORMAL),可能抛出异常(EXCEPTIONAL)        // 或任务被取消(CANCELLED,INTERRUPTING或INTERRUPTED状态的一种)        if (s > COMPLETING) {            // 【问】此时将当前WaitNode节点的线程置空,其中在任务结束时也会调用finishCompletion将WaitNode节点的thread置空,            // 这里为什么又要再调用一次q.thread = null;呢?            // 【答】因为若很多线程来获取任务执行结果,在任务执行完的那一刻,此时获取任务的线程要么已经在线程等待链表中,要么            // 此时还是一个孤立的WaitNode节点。在线程等待链表中的的所有WaitNode节点将由finishCompletion来移除(同时唤醒)所有            // 等待的WaitNode节点,以便垃圾回收;而孤立的线程WaitNode节点此时还未阻塞,因此不需要被唤醒,此时只要把其属性置为            // null,然后其有没有被谁引用,因此可以被GC。            if (q != null)                q.thread = null;            // 【重要】返回任务执行结果            return s;        }        // 【4】若任务状态为COMPLETING,此时说明任务正在执行过程中,此时获取任务结果的线程需让出CPU执行时间片段        else if (s == COMPLETING) // cannot time out yet            Thread.yield();        // 【1】若当前线程还没有进入线程等待链表的WaitNode节点,此时新建一个WaitNode节点,并把当前线程赋值给WaitNode节点的thread属性        else if (q == null)            q = new WaitNode();        // 【2】若当前线程等待节点还未入线程等待队列,此时加入到该线程等待队列的头部        else if (!queued)            queued = UNSAFE.compareAndSwapObject(this, waitersOffset,                                                 q.next = waiters, q);        // 若有超时设置,那么处理超时获取任务结果的逻辑        else if (timed) {            nanos = deadline - System.nanoTime();            if (nanos <= 0L) {                removeWaiter(q);                return state;            }            LockSupport.parkNanos(this, nanos);        }        // 【3】若没有超时设置,此时直接阻塞当前线程        else            LockSupport.park(this);    }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657FutureTask.awaitDone方法主要做的事情总结如下:首先awaitDone方法里面是一个死循环;若获取结果的当前线程被其他线程中断,此时移除该线程WaitNode链表节点,并抛出InterruptedException;如果任务状态state>COMPLETING,此时返回任务执行结果;若任务状态为COMPLETING,此时获取任务结果的线程需让出CPU执行时间片段;若q == null,说明当前线程还未设置到WaitNode节点,此时新建WaitNode节点并设置其thread属性为当前线程;若queued==false,说明当前线程WaitNode节点还未加入线程等待链表,此时加入该链表的头部;当timed设置为true时,此时该方法具有超时功能,关于超时的逻辑这里不详细分析;当前面6个条件都不满足时,此时阻塞当前线程。我们分析到这里,可以直到执行异步任务只能有一个线程来执行,而获取异步任务结果可以多线程来获取,当异步任务还未执行完时,此时获取异步任务结果的线程会加入线程等待链表中,然后调用调用LockSupport.park(this);方法阻塞当前线程。直到异步任务执行完成,此时会调用finishCompletion方法来唤醒并移除线程等待链表的每个WaitNode节点,这里这里唤醒(移除)WaitNode节点的线程是从链表头部开始的,前面我们也已经分析过。还有一个特别需要注意的就是awaitDone方法里面是一个死循环,当一个获取异步任务的线程进来后可能会多次进入多个条件分支执行不同的业务逻辑,也可能只进入一个条件分支。下面分别举两种可能的情况进行说明:情况1:当获取异步任务结果的线程进来时,此时异步任务还未执行完即state=NEW且没有超时设置时:第一次循环:此时q = null,此时进入上面代码标号【1】的判断分支,即为当前线程新建一个WaitNode节点;第二次循环:此时queued = false,此时进入上面代码标号【2】的判断分支,即将之前新建的WaitNode节点加入线程等待链表中;第三次循环:此时进入上面代码标号【3】的判断分支,即阻塞当前线程;第四次循环:加入此时异步任务已经执行完,此时进入上面代码标号【5】的判断分支,即返回异步任务执行结果。情况2:当获取异步任务结果的线程进来时,此时异步任务已经执行完即state>COMPLETING且没有超时设置时,此时直接进入上面代码标号【5】的判断分支,即直接返回异步任务执行结果即可,也不用加入线程等待链表了。4.5.2 FutureTask.report方法在get方法中,当异步任务执行结束后即不管异步任务正常还是异常结束,亦或是被cancel,此时获取异步任务结果的线程都会被唤醒,因此会继续执行FutureTask.report方法报告异步任务的执行情况,此时可能会返回结果,也可能会抛出异常。// FutureTask.javaprivate V report(int s) throws ExecutionException {    // 将异步任务执行结果赋值给x,此时FutureTask的成员变量outcome要么保存着    // 异步任务正常执行的结果,要么保存着异步任务执行过程中抛出的异常    Object x = outcome;    // 【1】若异步任务正常执行结束,此时返回异步任务执行结果即可    if (s == NORMAL)        return (V)x;    // 【2】若异步任务执行过程中,其他线程执行过cancel方法,此时抛出CancellationException异常    if (s >= CANCELLED)        throw new CancellationException();    // 【3】若异步任务执行过程中,抛出异常,此时将该异常转换成ExecutionException后,重新抛出。    throw new ExecutionException((Throwable)x);}4.6 FutureTask.cancel方法,取消执行任务我们最后再来看下FutureTask.cancel方法,我们一看到FutureTask.cancel方法,肯定一开始就天真的认为这是一个可以取消异步任务执行的方法,如果我们这样认为的话,只能说我们猜对了一半。// FutureTask.javapublic boolean cancel(boolean mayInterruptIfRunning) {    // 【1】判断当前任务状态,若state == NEW时根据mayInterruptIfRunning参数值给当前任务状态赋值为INTERRUPTING或CANCELLED    // a)当任务状态不为NEW时,说明异步任务已经完成,或抛出异常,或已经被取消,此时直接返回false。    // TODO 【问题】此时若state = COMPLETING呢?此时为何也直接返回false,而不能发出中断异步任务线程的中断信号呢??    // TODO 仅仅因为COMPLETING是一个瞬时态吗???    // b)当前仅当任务状态为NEW时,此时若mayInterruptIfRunning为true,此时任务状态赋值为INTERRUPTING;否则赋值为CANCELLED。    if (!(state == NEW &&          UNSAFE.compareAndSwapInt(this, stateOffset, NEW,              mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))        return false;    try {    // in case call to interrupt throws exception        // 【2】如果mayInterruptIfRunning为true,此时中断执行异步任务的线程runner(还记得执行异步任务时就把执行异步任务的线程就赋值给了runner成员变量吗)        if (mayInterruptIfRunning) {            try {                Thread t = runner;                if (t != null)                    // 中断执行异步任务的线程runner                    t.interrupt();            } finally { // final state                // 最后任务状态赋值为INTERRUPTED                UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);            }        }    // 【3】不管mayInterruptIfRunning为true还是false,此时都要调用finishCompletion方法唤醒阻塞的获取异步任务结果的线程并移除线程等待链表节点    } finally {        finishCompletion();    }    // 返回true    return true;}以上代码中,当异步任务状态state != NEW时,说明异步任务已经正常执行完或已经异常结束亦或已经被cancel,此时直接返回false;当异步任务状态state = NEW时,此时又根据mayInterruptIfRunning参数是否为true分为以下两种情况:当mayInterruptIfRunning = false时,此时任务状态state直接被赋值为CANCELLED,此时不会对执行异步任务的线程发出中断信号,值得注意的是这里对应的任务状态变化是NEW -> CANCELLED。当mayInterruptIfRunning = true时,此时会对执行异步任务的线程发出中断信号,值得注意的是这里对应的任务状态变化是NEW -> INTERRUPTING -> INTERRUPTED。最后不管mayInterruptIfRunning为true还是false,此时都要调用finishCompletion方法唤醒阻塞的获取异步任务结果的线程并移除线程等待链表节点。从FutureTask.cancel源码中我们可以得出答案,该方法并不能真正中断正在执行异步任务的线程,只能对执行异步任务的线程发出中断信号。如果执行异步任务的线程处于sleep、wait或join的状态中,此时会抛出InterruptedException异常,该线程可以被中断;此外,如果异步任务需要在while循环执行的话,此时可以结合以下代码来结束异步任务线程,即执行异步任务的线程被中断时,此时Thread.currentThread().isInterrupted()返回true,不满足while循环条件因此退出循环,结束异步任务执行线程,如下代码:public Integer call() throws Exception {    while (!Thread.currentThread().isInterrupted()) {        // 业务逻辑代码        System.out.println("running...");    }    return 666;}12345678注意:调用了FutureTask.cancel方法,只要返回结果是true,假如异步任务线程虽然不能被中断,即使异步任务线程正常执行完毕,返回了执行结果,此时调用FutureTask.get方法也不能够获取异步任务执行结果,此时会抛出CancellationException异常。请问知道这是为什么吗?因为调用了FutureTask.cancel方法,只要返回结果是true,此时的任务状态为CANCELLED或INTERRUPTED,同时必然会执行finishCompletion方法,而finishCompletion方法会唤醒获取异步任务结果的线程等待列表的线程,而获取异步任务结果的线程唤醒后发现状态s >= CANCELLED,此时就会抛出CancellationException异常了。5 总结好了,本篇文章对FutureTask的源码分析就到此结束了,下面我们再总结下FutureTask的实现逻辑:我们实现Callable接口,在覆写的call方法中定义需要执行的业务逻辑;然后把我们实现的Callable接口实现对象传给FutureTask,然后FutureTask作为异步任务提交给线程执行;最重要的是FutureTask内部维护了一个状态state,任何操作(异步任务正常结束与否还是被取消)都是围绕着这个状态进行,并随时更新state任务的状态;只能有一个线程执行异步任务,当异步任务执行结束后,此时可能正常结束,异常结束或被取消。可以多个线程并发获取异步任务执行结果,当异步任务还未执行完,此时获取异步任务的线程将加入线程等待列表进行等待;当异步任务线程执行结束后,此时会唤醒获取异步任务执行结果的线程,注意唤醒顺序是"后进先出"即后面加入的阻塞线程先被唤醒。当我们调用FutureTask.cancel方法时并不能真正停止执行异步任务的线程,只是发出中断线程的信号。但是只要cancel方法返回true,此时即使异步任务能正常执行完,此时我们调用get方法获取结果时依然会抛出CancellationException异常。扩展: 前面我们提到了FutureTask的runner,waiters和state都是用volatile关键字修饰,说明这三个变量都是多线程共享的对象(成员变量),会被多线程操作,此时用volatile关键字修饰是为了一个线程操作volatile属性变量值后,能够及时对其他线程可见。此时多线程操作成员变量仅仅用了volatile关键字仍然会有线程安全问题的,而此时Doug Lea老爷子没有引入任何线程锁,而是采用了Unsafe的CAS方法来代替锁操作,确保线程安全性。6 分析FutureTask源码,我们能学到什么?我们分析源码的目的是什么?除了弄懂FutureTask的内部实现原理外,我们还要借鉴大佬写写框架源码的各种技巧,只有这样,我们才能成长。分析了FutureTask源码,我们可以从中学到:利用LockSupport来实现线程的阻塞\唤醒机制;利用volatile和UNSAFE的CAS方法来实现线程共享变量的无锁化操作;若要编写超时异常的逻辑可以参考FutureTask的get(long timeout, TimeUnit unit)的实现逻辑;多线程获取某一成员变量结果时若需要等待时的线程等待链表的逻辑实现;某一异步任务在某一时刻只能由单一线程执行的逻辑实现;FutureTask中的任务状态state的变化处理的逻辑实现。…以上列举的几点都是我们可以学习参考的地方。若您觉得不错,请无情的转发和点赞吧!【源码笔记】Github地址:https://github.com/yuanmabiji/Java-SourceCode-Blogs
0 0 1342天前
baby
937
Nginx 405 not allowed最简单快速解决办法Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。server {   listen       80;   server_name  域名;      location /{      root /www/文件目录;      index index.html index.htm index.php;      error_page 405 =200 http://$host$request_uri;   }} 
0 0 1342天前
baby
1125
宝塔面板安装phpmyadmin的时候,访问出现405 Not Allowed (Nginx)解决方法:卸载phpmyadmin当前版本,重新安装phpmyadmin的最高版本。我重新安装了4.8版本的phpmyadmin。就可以正常打开phpmyadmin了。初步排查证明是版本过低的原因。
0 0 1342天前
admin
1156
什么叫多商城?什么叫单商城?什么叫商品池?商家在直播带货商城系统上的收益分为哪几部分?本期小编就针对于直播带货商城系统中所牵扯到的运营逻辑做一次详尽地解答。一、多商城系统直播带货商城系统中的商城一般包含两种,一个是平台自营的商城,一个是注册商户开启的商城。平台自营和注册商户都有各自的一套商城后台,这两个后台功能相近,但出于运营目的,一般平台自营的后台要比注册商户功能多一点,权限也更高。需要注意的一点是,有的直播带货商城系统中,注册商户是可以建立自己的店铺的,但是更多情况下,注册商户和平台自身都是把商品上传到后台的商品池中,然后在商品池中选择商品添加到自己的店铺中进行销售。这样的话,对于注册商户来说,资金收益的来源就会更多:即“直销”+代销。二、注册商户的种类除了平台自身外,根据运营需求的不同,注册直播带货商城系统的商户种类也会有所不同,一种是供货商,他们可以直接开店,用自家主播对商品进行带货销售,还可以让注册用户中的主播进行代销,这就是接下来要说的第二种注册“商户”,他们没有货源,但是可以将商品池中的商品添加到自己的“店铺”里,通过直播进行代销,当然,这些商品一般都是由供货商指定主播代销的,这样,主播就可以通过这种方式获得收益。还有一种“商户”,他们既没有货源,也不想开直播间,但是他们手里人脉广,朋友多,通过分享别人的直播间、产品海报、商品活动链接到社区里,这样,一旦有用户通过分享注册了账号并购买了商品,那么这个商户就获得了佣金,我们称之为“分销”。三、关于其他功能当然,除了分销代销外,直播带货商城系统也会包含其他营销功能,这些功能在现在的各类线上商城上基本都能看到,不限于:积分、优惠券、秒杀、团购等,其中的原理大家基本都能明白,在这里就不再详细赘述了。以上,就是直播带货商城系统中一些运营上的逻辑总结。
0 0 1342天前
admin
1101
随着数字化技术的逐渐发展,企业非生产物资的采购业务已经从信息化向数字化逐步转型,应运而生的数字化采购平台-企业采购商城,成为越来越多企业的转型首选。与此同时,一个新的岗位:采购运营,已逐步成为各大领军企业的采购部门的核心岗位。采购运营岗位的诞生在北美和欧洲,无论是从选择在线采购的企业数量,还是在线采购在总体中的占比,都已经经达到了较高的水平。国内近两年互联网与采购供应链的结合越来越紧密,采购数字化在中国逐渐普及。商越成立后,以采购商城为基础的采购数字化体系从大型头部企业中开始应用,采购商城成为企业采购数字化的必备工具,商越成为越来越多企业的转型首选。与此同时,“采购运营”新职业诞生,采购运营岗已成为部分领军企业的采购业务核心岗位。在传统的采购系统中,由于无商品详情展示、缺少物流追踪信息等系统缺陷,采购员更多的扮演了信息收集员、物流追踪员、售后处理员角色,每天频繁的在需求用户、供应商之间协调交流,处理纠纷;到了对账周期,工作量巨大,苦不堪言:线下数据的整理、收货数据的核实,发票与单据的匹配等等;成千上万个单据,一旦出错,就要耗费大量人力进行核实。同样,对于采购部门来说:一个岗位设定几个到十几个采购员、报料员,日复一日的处理着重复且枯燥的业务;对于企业管理来说:大量的线下采购,企业管理难以完全透明,分析统计又是不小的“工程”。长此以往,无论是对员工的成长,还是对于企业成本的缩减,都是十分不利的。而采购商城的建立,恰恰弥补了这一不足。可视化的商品及描述,订单物流线上可查,结算对账数据一目了然,需求用户按需自主提报,订单直达供应商;整个采购流程通过线上自动完成;无需人工干预;采购员仅需对个别异常单据专项跟进,大幅的减少了机械的事务性工作。如何让采购系统发挥最大价值,如何让需求用户和供应商更好的借助商城工具完成供应链的敏捷协同?采购运营岗位,应运而生。从商品的管理维度,采购运营需要对商品信息质量做把控,制定商品上架规范、展示规范。从数据分析的维度,同样对于运营人员所负责的品类商品数、订单数、供应商等等,需要通过分析其商城订单表现、供应商服务能力等数据,相应做供应商的轮换淘汰;而对于采购商城来说,如何推广,如何在企业中广泛被使用,如何让需求用户更加满意,都是采购运营所必须思考和挑战的;让用户会用、爱用、用好商城,是采购运营人员必须具备的能力。让商城好用、简单、流畅,是对商城系统优化的至高要求;采购运营人员更是在企业采购过程中,不断的创新、尝试,让原本枯燥的采购工作富有挑战,也为企业的人才培养,提供了机遇和场地。为了让企业采购效率更高、支出更加透明,流程更加流畅,采购运营人员的所承担的岗位职责再也不是简单的单据处理,而是要站在更高的角度上去思考和计划,去挖掘和实现真正的战略采购。通过采购商城工具,企业可直接解决企业物资采购6大痛点,在企业实行采购数字化后,采购员不再陷入在日常重复、繁琐、低效的采购需求应对和履约执行环节中;采购申请审批通过后系统自动转订单下发至供应商进行发货处理,过程无需采购员介入催货催单。收货数据自动生成应付流水,线上一键对账开票,节省采购员每月一次人肉手工对账录发票,采购员从事务性工作中脱离后,采购不再停留在“买东西、“找合适的货源买东西”,或“合适的价格、合适的时间、合适的质量买到合适的东西”。实行了数字化采购的企业,采购员摇身变成“采购运营”。采购运营岗与传统采购岗一个重要区分是,采购岗就采购需求进行反应,采购运营岗需对业务和采购流程全面理解,结合企业长期业务目标立体规划,对采购行为进行长远布局。数字化企业采购中采购运营岗位的主要职责1. 商城运营:企业采购商城的建设,商城的管理规则等运营类工作;让供应商在商城有规可循,给需求用户提供极致的商品展示、质量及服务;需求用户会用、爱用、用好商城,使企业采购数字化价值最大化。2. 品类运营:采购运营通过采购品类的梳理、商城分类的搭建、沉淀品类采购数据,并对商城的品类采购数据进行分析,制定品类策略。3. 用户运营:采购运营一定是最多接触需求用户,最懂需求用户的角色,采购运营岗需了解和分析用户的关注点,并建立对应的服务体系。4. 数据运营:以商城数据为支撑,从组织、品类、商品数、商品价格、品牌、订单数、供应商、评价等各维度进行全面的数据监控和分析;提炼商城对于企业具体降本增效的数据,同时分析未达标的指标,进行策略制定。5. 采购业务运营:定商定品定价均属于业务运营的范畴,比如从商品的管理维度,采购运营需要对商品信息质量做把控,制定商品上架规范、展示规范,从而给企业需求用户提供美好的采购体验。采购运营足迹遍布各大行业领军企业商越的核心价值观之一是成就客户,产品的上线是商越真正服务的开始,让客户用起来是我们始终坚持的核心价值观。其中商越提供的运营服务,为企业量身定制数字化企业采购运营方案,根据企业规模、业务条线等维度进行分析帮助企业建立采购运营团队,同时帮助企业建设采购运营能力,推动采购组织由管控型向服务型升级,以保企业的采购数字化建设得到最大程度的价值体现。新生的采购运营岗位,不只带来新的就业机会和职业规划,也为企业采购商城标准化系统提供可推广、可迭代的运营支持;采购运营,已经成为企业采购商城不可或缺的核心岗位。
0 0 1342天前
快速发帖 高级模式
联系站长 友链申请桂ICP备19000949号-1     桂ICP备19000949号-1
您的IP:54.198.146.224,2024-03-29 19:54:28,Processed in 0.21179 second(s).
免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。
Powered by HadSky 7.12.9
免责声明
1、本站资源,均来自网络,版权归原作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !
如果觉得本文还不错请点个赞或者打赏点轻币哦~
拒绝伸手党,拿走请回复,尊重楼主,尊重你我他~

侵权删除请致信 E-Mail:207882320@qq.com